From e4803717a08b04a370d45138fbf139a73925a7f8 Mon Sep 17 00:00:00 2001 From: Mario Dal Lago Date: Tue, 26 Jun 2018 17:24:23 -0300 Subject: [PATCH] initial commit --- docs/assets/bitprim_logo_orange.png | Bin 0 -> 9646 bytes docs/blank.md | 1 + docs/developer_guide/c++/C---interface.md | 35 + .../2017-06-28-010231_1920x1080_scrot.png | Bin 0 -> 93313 bytes .../2017-06-28-010906_1920x1080_scrot.png | Bin 0 -> 83579 bytes .../c++/assets/bitprim_package_diagram.png | Bin 0 -> 25355 bytes docs/developer_guide/c/C-interface.md | 56 + docs/developer_guide/c/api.md | 1901 ++++++++++++++ .../dotnet/assets/dotnet_interface.png | Bin 0 -> 7399 bytes .../dotnet/dotnet-Interface.md | 21 + .../dotnet/dotnet-interface-details.md | 2291 +++++++++++++++++ docs/developer_guide/go/Go-interface.md | 25 + docs/developer_guide/go/assets/binding_go.png | Bin 0 -> 21818 bytes docs/developer_guide/introduction.md | 12 + .../python/Python-interface-details.md | 1337 ++++++++++ .../python/Python-interface.md | 23 + .../developer_guide/python/assets/binding.png | Bin 0 -> 22164 bytes docs/developer_guide/python/details.md | 1465 +++++++++++ docs/index.md | 28 + docs/team.md | 26 + docs/user_guide/installation.md | 81 + docs/user_guide/introduction.md | 25 + docs/user_guide/releases_notes.md | 5 + docs/user_guide/rpc.md | 29 + mkdocs.yml | 41 + 25 files changed, 7402 insertions(+) create mode 100644 docs/assets/bitprim_logo_orange.png create mode 100644 docs/blank.md create mode 100644 docs/developer_guide/c++/C---interface.md create mode 100644 docs/developer_guide/c++/assets/2017-06-28-010231_1920x1080_scrot.png create mode 100644 docs/developer_guide/c++/assets/2017-06-28-010906_1920x1080_scrot.png create mode 100644 docs/developer_guide/c++/assets/bitprim_package_diagram.png create mode 100644 docs/developer_guide/c/C-interface.md create mode 100644 docs/developer_guide/c/api.md create mode 100644 docs/developer_guide/dotnet/assets/dotnet_interface.png create mode 100644 docs/developer_guide/dotnet/dotnet-Interface.md create mode 100644 docs/developer_guide/dotnet/dotnet-interface-details.md create mode 100644 docs/developer_guide/go/Go-interface.md create mode 100644 docs/developer_guide/go/assets/binding_go.png create mode 100644 docs/developer_guide/introduction.md create mode 100644 docs/developer_guide/python/Python-interface-details.md create mode 100644 docs/developer_guide/python/Python-interface.md create mode 100644 docs/developer_guide/python/assets/binding.png create mode 100644 docs/developer_guide/python/details.md create mode 100644 docs/index.md create mode 100644 docs/team.md create mode 100644 docs/user_guide/installation.md create mode 100644 docs/user_guide/introduction.md create mode 100644 docs/user_guide/releases_notes.md create mode 100644 docs/user_guide/rpc.md create mode 100644 mkdocs.yml diff --git a/docs/assets/bitprim_logo_orange.png b/docs/assets/bitprim_logo_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..f527101a0df652cf22dc03aa1b3dfc116cae1192 GIT binary patch literal 9646 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 literal 0 HcmV?d00001 diff --git a/docs/blank.md b/docs/blank.md new file mode 100644 index 0000000..c409365 --- /dev/null +++ b/docs/blank.md @@ -0,0 +1 @@ +## Test \ No newline at end of file diff --git a/docs/developer_guide/c++/C---interface.md b/docs/developer_guide/c++/C---interface.md new file mode 100644 index 0000000..03f4f46 --- /dev/null +++ b/docs/developer_guide/c++/C---interface.md @@ -0,0 +1,35 @@ +Bitprim's C++ interface is the base layer of the platform, the lowest abstraction level available. It's a fork of the Satoshi/reference implementation with several improvements, the main of them being modularization. Being monolithic, the reference client is harder to change, not only because a change ripples across the whole system, but also because it's not possible to mix and match different module implementations. + +## Package diagram + +--- + +If we were to view the Bitprim projects as UML packages, their dependencies would look like this \(some projects omitted for simplicity\): + +## ![](assets/bitprim_package_diagram.png)Which is the main responsibility/functionality for each package? + +--- + +* **secp256k1**: Implementation of the standard of the same name which deals with ellyptic curves cryptography. +* **bitprim-core**: Basic Bitcoin utilities \(encryption, wallet, math\) to be reused by all projects. +* **bitprim-consensus**: An implementation of Satoshi's algorithm for agreeing on a course of action \(achieving consensus\) between nodes in a network. +* **bitprim-database**: Defines how to store and manipulate Bitcoin transactions. +* **bitprim-network**: P2P communication rules between nodes in the Bitcoin network. +* **bitprim-protocol**: Defines payload structure and lower level communication details. +* **bitprim-blockchain**: Interface for accessing the Bitcoin public ledger, a.k.a. blockchain, in which all transactions are linked between them. +* **bitprim-node**: The highest level of abstraction: a full node in the Bitcoin network; it can query the blockchain in many ways and insert blocks as well. + +## Exploring the public interface for each package + +--- + +All packages follow the same structure: At the top level of their source tree, they have an **include** directory. Inside it, there's a single .hpp file which \#includes all the public headers for the package for convenience. Then, inside the include directory, all the public headers for the library reside. These represent the public interface, i.e. those classes meant to be consumed by other packages or programs built on top of the package. + +For example, for [bitprim-node](https://github.com/bitprim/bitprim-node): + +![](assets/2017-06-28-010231_1920x1080_scrot.png)Taking a look inside [full\_node.hpp](https://github.com/bitprim/bitprim-node/blob/master/include/bitcoin/node/full_node.hpp), we can see in its public methods how an instance of a full node can be consumed: + +![](assets/2017-06-28-010906_1920x1080_scrot.png) + +There's a constructor which receives a configuration object \(see [configuration.hpp](https://github.com/bitprim/bitprim-node/blob/master/include/bitcoin/node/configuration.hpp)\), a destructor, and more interestingly, functions for starting, running, stopping and closing the node. Some have callbacks \(start and run\), which the user will have to implement to handle the associated events asynchronously. Examples of how to do this can be seen in Bitprim projects which use the node package: [bitprim-client](https://github.com/bitprim/bitprim-client) and [bitprim-server](https://github.com/bitprim/bitprim-server). + diff --git a/docs/developer_guide/c++/assets/2017-06-28-010231_1920x1080_scrot.png b/docs/developer_guide/c++/assets/2017-06-28-010231_1920x1080_scrot.png new file mode 100644 index 0000000000000000000000000000000000000000..d25a54dcfe75d9b2664fa1e797d5d6d822356626 GIT binary patch literal 93313 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 AXaE2J literal 0 HcmV?d00001 diff --git a/docs/developer_guide/c++/assets/bitprim_package_diagram.png b/docs/developer_guide/c++/assets/bitprim_package_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..7b5c88709dabe315e4b1eacde4081eba960cd91e GIT binary patch literal 25355 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 NWNYPs%HQXH?Qae=ZE64j literal 0 HcmV?d00001 diff --git a/docs/developer_guide/c/C-interface.md b/docs/developer_guide/c/C-interface.md new file mode 100644 index 0000000..73bc866 --- /dev/null +++ b/docs/developer_guide/c/C-interface.md @@ -0,0 +1,56 @@ +Bitprim's C interface, the [bitprim-node-cint](https://github.com/bitprim/bitprim-node-cint) project, is built on top of the C++ interface. Asides from allowing a C library or program to consume all the Bitprim functionality, it can act as the base to create bindings for many current popular programming languages, such as Javascript, C\#, Golang, Java and Python. All of these languages can interface easily with C, but not with C++. + +Granted, the Object Oriented paradigm is lost when transitioning to C, but it can be "recovered" when implementing a binding in an object oriented language such as C\#. In such a context, classes can be built in order to give application programmers a friendlier interface for integrating Bitcoin in their projects, bridging the gap created by C/C++'s inherent complexity. + +Therefore, Bitprim's interface is not really meant to be consumed directly, but as the basis for a higher level binding in another language. To make this task easier, most functions will receive a parameter which will wrap the implicit object \(this\), so that OOP can be preserved in the binding if possible. + +## Resource management + +--- + +To avoid memory leaks, all C functions which allocate memory that must be released by the user are clearly documented as such. When implementing a binding on top of the C interface, it is advisable to use the [RAII idiom](https://www.hackcraft.net/raii/) whenever possible to relieve the application programmer from the burden of manual memory management. + +## Basic structure - memory management + +--- + +Since this is C we're dealing with, there is nothing beyond a set of functions and some user defined types, but there is [a structure](https://github.com/bitprim/bitprim-node-cint/tree/master/include/bitprim/nodecint) nevertheless. The main "entry point" for the interface are the functions from [executor\_c.h](https://github.com/bitprim/bitprim-node-cint/blob/master/include/bitprim/nodecint/executor_c.h) and the types defined in [primitives.h](https://github.com/bitprim/bitprim-node-cint/blob/master/include/bitprim/nodecint/primitives.h). To start consuming node functionality, the first step is calling one of these functions: + +```c +executor_t executor_construct(char const* path, FILE* sout, FILE* serr); + +executor_t executor_construct_fd(char const* path, int sout_fd, int serr_fd); +``` + +Any function with the **construct** suffix will create an object in dynamic memory, which will have to be released by calling the associated **destruct**: + +```c +void executor_destruct(executor_t exec); +``` + +This pattern will be seen with many other types; whenever an object is created by the user with a construct function, it will need to be released with destruct as soon as it is no longer needed. + +Another case is when a function needs to create an object for returning it. For example, if we wanted to fetch the transaction history for a specific Bitcoin address, we could use the fetch\_history function: + +```c +void fetch_history(executor_t exec, payment_address_t address, size_t limit, size_t from_height, + history_fetch_handler_t handler); +``` + +There's another concept in play here: a pointer to function acting as a callback. Looking at the definition for history\_fetch\_handler\_t in primitives.h: + +```c +typedef void (*history_fetch_handler_t)(int error, history_compact_list_t history); +``` + +The second parameter, history, is created dynamically, and therefore must be released by the user, even if he didn't create it. This has to be done this way because there is no way for the C interface to know when the user is done using history. Therefore, it is up to him/her to call history\__compact\_\_list_\_destruct\(history\)._ + +The remaining header files follow these conventions; transaction.h contains functions for manipulating a transaction object, block.h for blocks, and so on. Keep in mind that objects must be destroyed manually. + +## API documentation + +--- + +[Detailed documentation](api.md) + + diff --git a/docs/developer_guide/c/api.md b/docs/developer_guide/c/api.md new file mode 100644 index 0000000..59d5c5b --- /dev/null +++ b/docs/developer_guide/c/api.md @@ -0,0 +1,1901 @@ +# Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`enum `[`point_kind`](#primitives_8h_1a4de8699f33816d833b0d9a69fb08fc8a) | 0 = output, 1 = spend +`public void `[`block_destruct`](#block_8h_1ac0c31d7ecb4f682fac067a179cc468d1)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` | Release the memory held by a block object. +`public int `[`block_is_valid`](#block_8h_1af7395388b4f83298636e05de96b8bb7f)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` | Determine if a block is valid. +`public `[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` `[`block_header`](#block_8h_1aa644a0753e3d370f683883aecc37a199)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` | Get the block's header. +`public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`block_hash`](#block_8h_1a30cfad237bdb5bebe5fd7e3b48f3d410)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` | Get the block's hash. +`public size_t `[`block_transaction_count`](#block_8h_1a7efc8cd7a41f4dfe6286629ab9ebe59b)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` | Get the block's transaction count. +`public `[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` `[`block_transaction_nth`](#block_8h_1a0732e73992d9c4c4789fc54f39e8747a)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block,size_t n)` | Get the block's n-th transaction. +`public size_t `[`block_serialized_size`](#block_8h_1a5b8666350465a4501cb3e8002085a2b1)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block,uint32_t version)` | Get the block's serialized size. +`public uint64_t `[`block_subsidy`](#block_8h_1a6c9f4dca5ff1fc402d405e4216a82d86)`(size_t height)` | Get the block subsidy (miner_reward = block_subsidy + transaction_fees) +`public uint64_t `[`block_fees`](#block_8h_1a0ee8cfa6d663b50aff057932efb0eeaa)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` | Get the block's total transaction fees (miner_reward = block_subsidy + transaction_fees) +`public uint64_t `[`block_claim`](#block_8h_1a4a1d431723d6e90f80894bb6b6a9c213)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` | Get the block's claim. +`public uint64_t `[`block_reward`](#block_8h_1af91de8cf3d009d9bb291f3fdac1c35dd)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block,size_t height)` | Get the block's miner reward (miner_reward = block_subsidy + transaction_fees) +`public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`block_generate_merkle_root`](#block_8h_1accd9987fa1b37396e047f6e8b2251c12)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` | Generate a Merkle root for a block. +`public size_t `[`block_signature_operations`](#block_8h_1a0095ecbd424497725258918fc0c07acc)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` | Get the block's signature operations count. +`public size_t `[`block_signature_operations_bip16_active`](#block_8h_1adbc5bcd535157b8fca7e9869db80d68d)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block,int bip16_active)` | Get the block's BIP0016 signature operations count. +`public size_t `[`block_total_inputs`](#block_8h_1aded82b46e51e35812902beec2e60c508)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block,int with_coinbase)` | Get the block's input count. +`public int `[`block_is_extra_coinbases`](#block_8h_1acda164be7d985af0e920396fd5dbf438)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` | Determine if a block has extra coinbases. +`public int `[`block_is_final`](#block_8h_1aa3b0657e9a9141472d62e61b6ff7800a)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block,size_t height)` | Determine if a block is final. +`public int `[`block_is_distinct_transaction_set`](#block_8h_1a2a7648c49fb07ad150013289522e9a62)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` | Determine if a block contains a distinct transaction set. +`public int `[`block_is_valid_coinbase_claim`](#block_8h_1a18fb299820f406654184facc727f6359)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block,size_t height)` | Determine if a block contains a valid coinbase claim. +`public int `[`block_is_valid_coinbase_script`](#block_8h_1aa8e9758dd0e41b4ebcf0daef7cb50af2)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block,size_t height)` | Determine if a block contains a valid coinbase script. +`public int `[`block_is_internal_double_spend`](#block_8h_1a7c4a0d1bd346fe47a8f0022427b47b9c)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` | Determine if a block contains an internal double spend. +`public int `[`block_is_valid_merkle_root`](#block_8h_1ae3e37f3180a5403625db8bdbe6d105ee)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` | Determine if a block has a valid Merkle root. +`public `[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` `[`compact_block_header`](#compact__block_8h_1a8cf34d1187d38c7d6201453289a19d5c)`(`[`compact_block_t`](#primitives_8h_1a43ccacc67cf17b4bf244f421228028ad)` block)` | Get compact block header. +`public int `[`compact_block_is_valid`](#compact__block_8h_1accb0d739d132cbed90dc3495886a05b0)`(`[`compact_block_t`](#primitives_8h_1a43ccacc67cf17b4bf244f421228028ad)` block)` | Determine if a compact block is valid. +`public size_t `[`compact_block_serialized_size`](#compact__block_8h_1aa96e45a0eb41a7d8bcfe03340d8e502b)`(`[`compact_block_t`](#primitives_8h_1a43ccacc67cf17b4bf244f421228028ad)` block,uint32_t version)` | Get a compact block's serialized size. +`public size_t `[`compact_block_transaction_count`](#compact__block_8h_1ae0785b7c6e06c6cb188c94fa0da5b98c)`(`[`compact_block_t`](#primitives_8h_1a43ccacc67cf17b4bf244f421228028ad)` block)` | Get the compact block's transaction count. +`public `[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` `[`compact_block_transaction_nth`](#compact__block_8h_1ad271eeb9ab8a4148a4065e380cb8213b)`(`[`compact_block_t`](#primitives_8h_1a43ccacc67cf17b4bf244f421228028ad)` block,size_t n)` | Get a compact block's n-th transaction. +`public uint64_t `[`compact_block_nonce`](#compact__block_8h_1aebea00334de2af9b07f9e6a9acd333d7)`(`[`compact_block_t`](#primitives_8h_1a43ccacc67cf17b4bf244f421228028ad)` block)` | Get compact block's nonce. +`public void `[`compact_block_destruct`](#compact__block_8h_1ace80b5f64b9e64e7c53c65d98a3cae4c)`(`[`compact_block_t`](#primitives_8h_1a43ccacc67cf17b4bf244f421228028ad)` block)` | Release memory held by compact block instance. +`public void `[`compact_block_reset`](#compact__block_8h_1a24b85a581e03ba42eafbe80f276bf01a)`(`[`compact_block_t`](#primitives_8h_1a43ccacc67cf17b4bf244f421228028ad)` block)` | Reset compact block. +`public `[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` `[`executor_construct`](#executor__c_8h_1aed246db742bdb2aeee6842a8743ea094)`(char const * path,FILE * sout,FILE * serr)` | Creates an executor instance, which controls a node in the network. +`public `[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` `[`executor_construct_fd`](#executor__c_8h_1ad9e4e0f23310637271e442585696de0c)`(char const * path,int sout_fd,int serr_fd)` | Creates an executor instance, which controls a node in the network. +`public void `[`executor_destruct`](#executor__c_8h_1a963f4bbda682b0bdf66d73a374a1ac89)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec)` | Destroys an executor instance (it only releases memory) +`public void `[`executor_run`](#executor__c_8h_1a53815abff7a75a5c963b342f8aa2f8bf)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`run_handler_t`](#primitives_8h_1a042c0a527cc2744c80e2565a7b7beb9e)` handler)` | After [executor_initchain()](#executor__c_8h_1a5edfd9a2012e7345e9908a6d80baeaf6) has been called, the node can be started using this function. This is an asynchronous function, hence the callback parameter. +`public int `[`executor_run_wait`](#executor__c_8h_1abd814e409c84aac34363c21452cabd58)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec)` | After [executor_initchain()](#executor__c_8h_1a5edfd9a2012e7345e9908a6d80baeaf6) has been called, the node can be started using this function. This is a synchronous function, so it will block until node has started running. +`public int `[`executor_initchain`](#executor__c_8h_1a5edfd9a2012e7345e9908a6d80baeaf6)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec)` | Initializes the chain for this node. It only creates the structure; the blockchain won't be synced. +`public void `[`executor_stop`](#executor__c_8h_1a80a0e1814db0a389e0ae7ba1a43c78e8)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec)` | Stops execution of the node. +`public void `[`fetch_last_height`](#executor__c_8h_1a83a045615b9be929f3331ef5302ec772)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`last_height_fetch_handler_t`](#primitives_8h_1a7319bd077428255061dc7c773ebc0cc4)` handler)` | Get the current blockchain height. +`public int `[`get_last_height`](#executor__c_8h_1a791b814d3928a00faa6138ea2d33c5b9)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,size_t * height)` | Get the current blockchain height. This is the synchronous version of [fetch_last_height()](#executor__c_8h_1a83a045615b9be929f3331ef5302ec772), so it will block until height is retrieved from the network, or an error occurs. +`public void `[`fetch_block_height`](#executor__c_8h_1a903aec1424b51b8810273cf5642b70d0)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,`[`block_height_fetch_handler_t`](#primitives_8h_1a7f26119f3693225e3698e80e8d7e64c9)` handler)` | Given a block, get its height in the blockchain. +`public int `[`get_block_height`](#executor__c_8h_1a0c140100f1eefa4dc6707e93568fdcc1)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,size_t * height)` | Given a block, get its height in the blockchain. This is the synchronous version of [fetch_block_height()](#executor__c_8h_1a903aec1424b51b8810273cf5642b70d0), so it will block until height is retrieved from the network, or an error occurs. +`public void `[`fetch_block_header_by_height`](#executor__c_8h_1ae4d491f18285c2b31b6261683ef5679b)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,size_t height,`[`block_header_fetch_handler_t`](#primitives_8h_1a175320d3fdee884d5b1daba1f51af6cf)` handler)` | Given a height in the blockchain, retrieve its block's header. +`public int `[`get_block_header_by_height`](#executor__c_8h_1a2b2cb61fd05544b98a8829c6fc357a06)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,size_t height,`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` * header,size_t * ret_height)` | Given a height in the blockchain, retrieve its block's header. This is the synchronous version of [fetch_block_header_by_height()](#executor__c_8h_1ae4d491f18285c2b31b6261683ef5679b), so it will block until the header is retrieved from the network, or an error occurs. +`public void `[`fetch_block_header_by_hash`](#executor__c_8h_1a660eb713c231f3daa2a1cfb5fbfa4bd4)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,`[`block_header_fetch_handler_t`](#primitives_8h_1a175320d3fdee884d5b1daba1f51af6cf)` handler)` | Given a block hash, retrieve its header. +`public int `[`get_block_header_by_hash`](#executor__c_8h_1a21e7310364624f505d7e16190fe1fa3c)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` * header,size_t * ret_height)` | Given a block hash, retrieve its header. This is the synchronous version of [fetch_block_header_by_height()](#executor__c_8h_1ae4d491f18285c2b31b6261683ef5679b), so it will block until the header is retrieved from the network, or an error occurs. +`public void `[`fetch_block_by_height`](#executor__c_8h_1a1ce9ccf736baf9f52e26093e7787f7a3)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,size_t height,`[`block_fetch_handler_t`](#primitives_8h_1a8c1fb1e052b08b1188d614222a9de9b2)` handler)` | Given a block's height, retrieve the block. +`public int `[`get_block_by_height`](#executor__c_8h_1a1887b7fb6d869838e66afd19a09b50d2)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,size_t height,`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` * block,size_t * ret_height)` | Given a block's height, retrieve the block. This is the synchronous version of [fetch_block_by_height()](#executor__c_8h_1a1ce9ccf736baf9f52e26093e7787f7a3), so it will block until the block is retrieved from the network, or an error occurs. +`public void `[`fetch_block_by_hash`](#executor__c_8h_1a0e2e7826e0ed92f46f06fb7c50d0b5e2)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,`[`block_fetch_handler_t`](#primitives_8h_1a8c1fb1e052b08b1188d614222a9de9b2)` handler)` | Given a block's hash, retrieve the block. +`public int `[`get_block_by_hash`](#executor__c_8h_1a13e08557af5950a19019e4ff55791d12)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` * block,size_t * ret_height)` | Given a block's hash, retrieve the block. This is the synchronous version of [fetch_block_by_height()](#executor__c_8h_1a1ce9ccf736baf9f52e26093e7787f7a3), so it will block until the block is retrieved from the network, or an error occurs. +`public void `[`fetch_merkle_block_by_height`](#executor__c_8h_1a8133807dfb7628a247f191608976c47b)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,size_t height,`[`merkle_block_fetch_handler_t`](#primitives_8h_1aff6e1e0990f9e15ea36d9a1ce64890ff)` handler)` | Given a Merkle block's height, retrieve the block. +`public void `[`fetch_merkle_block_by_hash`](#executor__c_8h_1aca145cfaa6db94792255beef98e57b94)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,`[`merkle_block_fetch_handler_t`](#primitives_8h_1aff6e1e0990f9e15ea36d9a1ce64890ff)` handler)` | Given a Merkle block's hash, retrieve the block. +`public void `[`fetch_compact_block_by_height`](#executor__c_8h_1a553b3ba0d2df8d9c3cc0d544f570d976)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,size_t height,`[`compact_block_fetch_handler_t`](#primitives_8h_1ae4895924faf7b39c24a050618ebf6c51)` handler)` | Given a compact block's height, retrieve the block. +`public void `[`fetch_compact_block_by_hash`](#executor__c_8h_1a7a2060ab5f19214db5431646c98a09b8)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,`[`compact_block_fetch_handler_t`](#primitives_8h_1ae4895924faf7b39c24a050618ebf6c51)` handler)` | Given a compact block's hash, retrieve the block. +`public void `[`fetch_transaction`](#executor__c_8h_1a99a0cbcfe63b6381c738d21bd7826b3d)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,int require_confirmed,`[`transaction_fetch_handler_t`](#primitives_8h_1ae0808043043d84636e3a2e3c754b8fd6)` handler)` | Given a transaction hash, retrieve it (optionally requiring it to be confirmed) +`public int `[`get_transaction`](#executor__c_8h_1a7f74db96f0bd243d3568c771896d3a24)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,int require_confirmed,`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` * transaction,size_t * ret_height,size_t * index)` | Given a transaction's hash, retrieve it This is the synchronous version of [fetch_transaction()](#executor__c_8h_1a99a0cbcfe63b6381c738d21bd7826b3d), so it will block until the transaction is retrieved from the network, or an error occurs. +`public void `[`fetch_transaction_position`](#executor__c_8h_1a699c29f962fa7c4302ee04b21cf82a9a)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,int require_confirmed,`[`transaction_index_fetch_handler_t`](#primitives_8h_1a83733f3195e3e03a0d9f4cc822b48a3d)` handler)` | Given a transaction hash, retrieve its position inside the block (optionally requiring it to be confirmed) +`public void `[`fetch_output`](#executor__c_8h_1afcc2cb87a88aabb6a712435cee9abc9a)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,uint32_t index,int require_confirmed,`[`output_fetch_handler_t`](#primitives_8h_1aefbd8dfda0d008880de7c60bcf23dde9)` handler)` | Given an output hash, retrieve it (optionally requiring it to be confirmed) +`public int `[`get_output`](#executor__c_8h_1a8d35fe3911046137e8cace26f8a3c938)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,uint32_t index,int require_confirmed,`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` * output)` | Given an output's hash, retrieve it This is the synchronous version of [fetch_output()](#executor__c_8h_1afcc2cb87a88aabb6a712435cee9abc9a), so it will block until the output is retrieved from the network, or an error occurs. +`public void `[`fetch_spend`](#executor__c_8h_1a4966f126f69c313903cbf0f46be79f9d)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`output_point_t`](#primitives_8h_1ad4d5035e7d5ca4f6a10eafdfdfd2e074)` outpoint,`[`spend_fetch_handler_t`](#primitives_8h_1aae597f1c61dc1dc585f5425375300ce3)` handler)` | Given an output point, retrieve its spend. +`public void `[`fetch_history`](#executor__c_8h_1a6ca41df13a8c7d67781d3a6005841ba6)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`payment_address_t`](#primitives_8h_1acc9e0ae61a6bf90f01911484e4ede07b)` address,size_t limit,size_t from_height,`[`history_fetch_handler_t`](#primitives_8h_1aee0367afd480cf2771d49690c567c25a)` handler)` | Given a payment address, a starting height and an entry limit, retrieve its transaction history. +`public int `[`get_history`](#executor__c_8h_1a1760fe0ef7ec0479230bf77ca7a2ea21)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`payment_address_t`](#primitives_8h_1acc9e0ae61a6bf90f01911484e4ede07b)` address,size_t limit,size_t from_height,`[`history_compact_list_t`](#primitives_8h_1aa9b635e04d3d0e124549cbef8b147638)` * out_history)` | Given a payment address, a starting height and an entry limit, retrieve its transaction history This is the synchronous version of [fetch_history()](#executor__c_8h_1a6ca41df13a8c7d67781d3a6005841ba6), so it will block until the history is retrieved from the network, or an error occurs. +`public `[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` `[`hex_to_tx`](#executor__c_8h_1a8af262d3a75ff3da484cbbccac8a987a)`(char const * tx_hex)` | Converts a raw transaction hex string to a transaction object. +`public void `[`validate_tx`](#executor__c_8h_1a26fae1c08f21b9f8097e944ebc8ebcc4)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` tx,`[`validate_tx_handler_t`](#primitives_8h_1a4a5ad506c3c92b9308072dcc1815ec17)` handler)` | Validates a new transaction (has not been added to the blockchain yet) +`public `[`long_hash_t`](#primitives_8h_1a15a7913e47813e6707bf348da7203f1a)` `[`wallet_mnemonics_to_seed`](#executor__c_8h_1abfdab2c4350be9e094478db62f440547)`(`[`word_list_t`](#primitives_8h_1a547ee5b6df76cdddedd5e12dea357036)` mnemonics)` | Convert a set of keywords/mnemonics to an HD wallet seed. +`public void `[`long_hash_destroy`](#executor__c_8h_1a636893dd40262d359bde53923e0a5d1c)`(`[`long_hash_t`](#primitives_8h_1a15a7913e47813e6707bf348da7203f1a)` ptr)` | Release the memory held by a long hash object. +`public void `[`header_destruct`](#header_8h_1a1d1d3fc9341337e1bddd2681fdfed682)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` | Releases memory held by the header object. +`public int `[`header_is_valid`](#header_8h_1adaabb8aadd2c899fc4c7361532b1fd8e)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` | Determine if the header is valid. +`public uint32_t `[`header_version`](#header_8h_1a59dc1762a22e8a9ee84c66e20660767b)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` | Get header version. +`public void `[`header_set_version`](#header_8h_1af95ba2aea724401b648863129ab40a02)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header,uint32_t version)` | Set a header's version. +`public uint32_t `[`header_timestamp`](#header_8h_1aa72c883fde1a10067725e0772c6e687f)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` | Get header timestamp. +`public void `[`header_set_timestamp`](#header_8h_1a29d0a46719548d37c95fc4e1a456353a)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header,uint32_t timestamp)` | Set header timestamp. +`public uint32_t `[`header_bits`](#header_8h_1a6a505d7f8f1137fe68b6b096ed35a15a)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` | Get header bits. +`public void `[`header_set_bits`](#header_8h_1ad9acf477b496b3d6d632b70483dfad81)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header,uint32_t bits)` | Set header bits. +`public uint32_t `[`header_nonce`](#header_8h_1acb3466f0d21884c5ba4c272571440610)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` | Get header nonce. +`public void `[`header_set_nonce`](#header_8h_1ab4dd1bb2ed0a537cf237e7dc82184d0c)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header,uint32_t nonce)` | Set header nonce +`public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`header_previous_block_hash`](#header_8h_1ac048f31bf04639f83e5be544adf9b977)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` | Get previous block hash. +`public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`header_merkle`](#header_8h_1af0f199ca6fed2c5cc37fedfe5dd86b47)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` | Get header Merkle. +`public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`header_hash`](#header_8h_1a625887dacbb1b408e292e0ff6a5638fc)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` | Get header hash. +`public `[`point_kind_t`](#primitives_8h_1a6f08d747fe788aa53ad4e70e58230078)` `[`history_compact_get_point_kind`](#history__compact_8h_1ad821d566985946fe24bc56f95d3a89c2)`(`[`history_compact_t`](#primitives_8h_1afecbcaff5ab6fec4cda05ca77abb093d)` history)` | Get the entry's point kind. +`public `[`point_t`](#primitives_8h_1af6e7950f472a081d958eb8519843d38b)` `[`history_compact_get_point`](#history__compact_8h_1a86510b343ae158fb7ceefbdbdb92a304)`(`[`history_compact_t`](#primitives_8h_1afecbcaff5ab6fec4cda05ca77abb093d)` history)` | Get the entry's point. +`public uint32_t `[`history_compact_get_height`](#history__compact_8h_1abbe2e7a92e48a0a32b261bcdfd723f07)`(`[`history_compact_t`](#primitives_8h_1afecbcaff5ab6fec4cda05ca77abb093d)` history)` | Get the height of history entry in the blockchain. +`public uint64_t `[`history_compact_get_value_or_previous_checksum`](#history__compact_8h_1a3421ce4d489fbda735d8de833bd1e090)`(`[`history_compact_t`](#primitives_8h_1afecbcaff5ab6fec4cda05ca77abb093d)` history)` | Get the entry's value. +`public void `[`history_compact_list_destruct`](#history__compact__list_8h_1aec9ce8654f6d88baf7deab18764e9b52)`(`[`history_compact_list_t`](#primitives_8h_1aa9b635e04d3d0e124549cbef8b147638)` history_compact_list)` | Release memory held by a history compact list instance. +`public size_t `[`history_compact_list_count`](#history__compact__list_8h_1a9e3ccd8686469993bb94a73ceb3bac65)`(`[`history_compact_list_t`](#primitives_8h_1aa9b635e04d3d0e124549cbef8b147638)` history_compact_list)` | Get the amount of entries in the list. +`public `[`history_compact_t`](#primitives_8h_1afecbcaff5ab6fec4cda05ca77abb093d)` `[`history_compact_list_nth`](#history__compact__list_8h_1ad202250e8072936b89cb9381034c05a7)`(`[`history_compact_list_t`](#primitives_8h_1aa9b635e04d3d0e124549cbef8b147638)` history_list,size_t n)` | Get the list's n-th entry. +`public void `[`input_destruct`](#input_8h_1a07e22ee2679bf79e657229c161e6c669)`(`[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` input)` | Release the memory held by an input instance. +`public int `[`input_is_valid`](#input_8h_1a2403b0b3e70fc82976302dce797feeb8)`(`[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` input)` | Determine if an input is valid. +`public int `[`input_is_final`](#input_8h_1ad4c90e8e665df2478bbe2861cf16f3ce)`(`[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` input)` | Determine if an input is final. +`public size_t `[`input_serialized_size`](#input_8h_1ac5ce4f197473b950042053bc378311e1)`(`[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` input,int wire)` | Get the input's serialized size. +`public uint32_t `[`input_sequence`](#input_8h_1a17ca854ca78275acddea0a46bcf241f9)`(`[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` input)` | Get the input's sequence number. +`public size_t `[`input_signature_operations`](#input_8h_1a6112eeed9ced97e9b8a65535d259b455)`(`[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` input,int bip16_active)` | Get the input's signature operations count. +`public `[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` `[`input_script`](#input_8h_1a5962a64778d3825861968bd7b93f37ca)`(`[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` input)` | Get input script. +`public `[`output_point_t`](#primitives_8h_1ad4d5035e7d5ca4f6a10eafdfdfd2e074)` `[`input_previous_output`](#input_8h_1a6117fe1c39f484f7fef1d76df61cb514)`(`[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` input)` | Get the input's previous output. +`public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`merkle_block_hash_nth`](#merkle__block_8h_1ae8c9b3a6d6573a51ab7908ae8dd82f78)`(`[`merkle_block_t`](#primitives_8h_1a17bcda76594c1a89acd36ec09d5e41a9)` block,size_t n)` | Get the block's n-th hash. +`public `[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` `[`merkle_block_header`](#merkle__block_8h_1ad4ee91f14e5bab50b388c5438ad59698)`(`[`merkle_block_t`](#primitives_8h_1a17bcda76594c1a89acd36ec09d5e41a9)` block)` | Get Merkle block header. +`public int `[`merkle_block_is_valid`](#merkle__block_8h_1ab0176f1b613f53a57476828a302a4178)`(`[`merkle_block_t`](#primitives_8h_1a17bcda76594c1a89acd36ec09d5e41a9)` block)` | Determine if a Merkle block is valid. +`public size_t `[`merkle_block_hash_count`](#merkle__block_8h_1acb42d10ee086d6093266b98840da6c6b)`(`[`merkle_block_t`](#primitives_8h_1a17bcda76594c1a89acd36ec09d5e41a9)` block)` | Get Merkle block hash count. +`public size_t `[`merkle_block_serialized_size`](#merkle__block_8h_1afb2d66d2e76d8e409b736cd7d0383302)`(`[`merkle_block_t`](#primitives_8h_1a17bcda76594c1a89acd36ec09d5e41a9)` block,uint32_t version)` | Get Merkle block serialized size. +`public size_t `[`merkle_block_total_transaction_count`](#merkle__block_8h_1afb0c146c7501223601376a6144c953d6)`(`[`merkle_block_t`](#primitives_8h_1a17bcda76594c1a89acd36ec09d5e41a9)` block)` | Get Merkle block transaction count. +`public void `[`merkle_block_destruct`](#merkle__block_8h_1af871439cfb75225e78af8e3454a20ca3)`(`[`merkle_block_t`](#primitives_8h_1a17bcda76594c1a89acd36ec09d5e41a9)` block)` | Release memory held by Merkle block instance. +`public void `[`merkle_block_reset`](#merkle__block_8h_1a45c8fca631807d31b893cff090e480e0)`(`[`merkle_block_t`](#primitives_8h_1a17bcda76594c1a89acd36ec09d5e41a9)` block)` | Reset Merkle block. +`public void `[`output_destruct`](#output_8h_1a974f0d91520ed93250bcd56e2d921590)`(`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` output)` | Release memory held by an output instance. +`public int `[`output_is_valid`](#output_8h_1a0d68a3cfb17807c9a72c5e36a5ee15ce)`(`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` output)` | Determine if an output is valid. +`public size_t `[`output_serialized_size`](#output_8h_1a24adac96e97aa036e0336b309c71fd39)`(`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` output,int wire)` | Get the output's serialized size. +`public uint64_t `[`output_value`](#output_8h_1ab6f944581267dbc41e2fa251f2ff7546)`(`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` output)` | Get the output's value. +`public size_t `[`output_signature_operations`](#output_8h_1a4cbbc9de86c223a7f473c18e8a86f305)`(`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` output)` | Get the output signature operations count. +`public `[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` `[`output_script`](#output_8h_1a8d1f20140cb6d480fbfe0e2622fa5065)`(`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` output)` | : Get the output's script +`public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`output_get_hash`](#output_8h_1aabd1bd7f280dc40de4e81b3470bb1ab4)`(`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` output)` | Get output hash. +`public uint32_t `[`output_get_index`](#output_8h_1a0c90a1cb8f51f0a7451a965582a677fb)`(`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` output)` | Get the output's index. +`public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`output_point_get_hash`](#output__point_8h_1ac9f315a515685375a2b015f2afe17eef)`(`[`output_point_t`](#primitives_8h_1ad4d5035e7d5ca4f6a10eafdfdfd2e074)` output)` | Get the output point's hash. +`public `[`output_point_t`](#primitives_8h_1ad4d5035e7d5ca4f6a10eafdfdfd2e074)` `[`output_point_construct`](#output__point_8h_1aeb7c309b991761bff5cdc4c5cdcbad1e)`()` | Create an empty output point. +`public uint32_t `[`output_point_get_index`](#output__point_8h_1a496394e7491a75771b40d85c400665c2)`(`[`output_point_t`](#primitives_8h_1ad4d5035e7d5ca4f6a10eafdfdfd2e074)` output)` | Get output point index inside the point. Starts at 0 (zero) with the first one. +`public void `[`output_point_destruct`](#output__point_8h_1a4ae2358a29f31e9a0351585fbf61b993)`(`[`output_point_t`](#primitives_8h_1ad4d5035e7d5ca4f6a10eafdfdfd2e074)` output)` | Release memory held by output point. +`public char const * `[`payment_address_encoded`](#payment__address_8h_1a51b00cfb74d43f59cf2ca2e735a2f7f1)`(`[`payment_address_t`](#primitives_8h_1acc9e0ae61a6bf90f01911484e4ede07b)` payment_address)` | Encode a payment address. +`public `[`payment_address_t`](#primitives_8h_1acc9e0ae61a6bf90f01911484e4ede07b)` `[`payment_address_construct_from_string`](#payment__address_8h_1a266e2071493b7ed6c7ff9bc9eb80b8fb)`(char const * address)` | Create a payment address from a string. +`public uint8_t `[`version`](#payment__address_8h_1a20d1238557cc4df561e5b09816ea9450)`(`[`payment_address_t`](#primitives_8h_1acc9e0ae61a6bf90f01911484e4ede07b)` payment_address)` | Get payment address version. +`public void `[`payment_address_destruct`](#payment__address_8h_1a4b3dbd5712e7c6569c02763e0dfe4baa)`(`[`payment_address_t`](#primitives_8h_1acc9e0ae61a6bf90f01911484e4ede07b)` payment_address)` | Release memory held by payment address instance. +`public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`point_get_hash`](#point_8h_1a2a624b2b8a7f329d9962b7a1924e12ab)`(`[`point_t`](#primitives_8h_1af6e7950f472a081d958eb8519843d38b)` point)` | Get point hash. +`public int `[`point_is_valid`](#point_8h_1aa3224fcebb1829ab9916069c4473859c)`(`[`point_t`](#primitives_8h_1af6e7950f472a081d958eb8519843d38b)` point)` | Determine if point is valid. +`public uint32_t `[`point_get_index`](#point_8h_1a3fc9f37c57e85b06b0f5b4c6c16ba212)`(`[`point_t`](#primitives_8h_1af6e7950f472a081d958eb8519843d38b)` point)` | Get point index. +`public uint64_t `[`point_get_checksum`](#point_8h_1a643229ebf5215c2068cee98d0e15fc7c)`(`[`point_t`](#primitives_8h_1af6e7950f472a081d958eb8519843d38b)` point)` | Get point checksum. +`public `[`point_t`](#primitives_8h_1af6e7950f472a081d958eb8519843d38b)` `[`point_list_nth`](#point__list_8h_1a81e77050195c59f9d6a618fe8e3f77e1)`(`[`point_list_t`](#primitives_8h_1a58aa9400b0e0aaa34d6b5a1a2666bb29)` point_list,size_t n)` | Get the list's n-th point. +`public size_t `[`point_list_count`](#point__list_8h_1a235ce31f8d2e130a3cbb998f7cf9f459)`(`[`point_list_t`](#primitives_8h_1a58aa9400b0e0aaa34d6b5a1a2666bb29)` point_list)` | Get point list count. +`public void `[`point_list_destruct`](#point__list_8h_1a06f5db8b275deb99ba1c3a31e60e86a2)`(`[`point_list_t`](#primitives_8h_1a58aa9400b0e0aaa34d6b5a1a2666bb29)` point_list)` | Release memory held by point list instance. +`public void `[`script_destruct`](#script_8h_1a594a6462fb996f38aa6f7b6f54b0c9e0)`(`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` script)` | Release memory held by a script instance. +`public int `[`script_is_valid`](#script_8h_1ac13f89765de02c5e08a39d8f76c1ad2f)`(`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` script)` | Determine if a script is valid. +`public int `[`script_is_valid_operations`](#script_8h_1afe1d83cba0d1d005d285882eeacc06a3)`(`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` script)` | Determine if the script operations are valid. +`public size_t `[`script_satoshi_content_size`](#script_8h_1a022d8a549bdde964bc1c00a77d50f2d0)`(`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` script)` | Get the script Satoshi content size. +`public size_t `[`script_serialized_size`](#script_8h_1ac7d8b5cbb37e481721fd5dffd58fbc4d)`(`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` script,bool prefix)` | Get script serialized size. +`public char const * `[`script_to_string`](#script_8h_1a16eafae91b17dc195dee2fc03b9219f4)`(`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` script,uint32_t active_forks)` | Get script string representation. +`public size_t `[`script_sigops`](#script_8h_1ab8814aa7853426f6ed6b3de848a27c83)`(`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` script,bool embedded)` | Get script signature operations (sigops) count. +`public size_t `[`script_embedded_sigops`](#script_8h_1a490c2ea9b3c053eb1048a3a90b8eefea)`(`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` script,`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` prevout_script)` | Get script embedded signature operations (sigops) count. +`public void `[`transaction_destruct`](#transaction_8h_1ad32fc27899d84318a183ecf152967570)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Release memory held by transaction instance. +`public int `[`transaction_is_valid`](#transaction_8h_1ad25670d899126e24ab1d156ac967a4df)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Determine if a transaction is valid. +`public uint32_t `[`transaction_version`](#transaction_8h_1ac2ab82b5e4ce6a7fbe0b253274849c34)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Get transaction version. +`public void `[`transaction_set_version`](#transaction_8h_1a3a5951371c882dc42d49e1a87ccb7401)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,uint32_t version)` | Set transaction version. +`public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`transaction_hash`](#transaction_8h_1a0e6db5b986bbc034483d319f1221b37c)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Get transaction hash. +`public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`transaction_hash_sighash_type`](#transaction_8h_1a922f312aad666746d25921814a6f1272)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,uint32_t sighash_type)` | Get transaction sighash by type. +`public uint32_t `[`transaction_locktime`](#transaction_8h_1a2c606bb46d54f237d9e19075e8336b4e)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Get transaction locktime. +`public size_t `[`transaction_serialized_size`](#transaction_8h_1a742cb6b1ef15066f58ea808292888977)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,int wire)` | Get transaction serialized size. +`public uint64_t `[`transaction_fees`](#transaction_8h_1a18e73484e57bb57571c2496f2fb361da)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Get transaction fees. +`public size_t `[`transaction_signature_operations`](#transaction_8h_1a2a51456f9e148f42c5dd84e1eca4e119)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Get transaction signature operations count. +`public size_t `[`transaction_signature_operations_bip16_active`](#transaction_8h_1a56c17116d7235f6ebec6e25ffdcdbc0b)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,int bip16_active)` | Get transaction BIP0016 signature operations count. +`public uint64_t `[`transaction_total_input_value`](#transaction_8h_1a72a7d67b3a88aea60275c6a4279e3150)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Get the sum of the transaction input values. +`public uint64_t `[`transaction_total_output_value`](#transaction_8h_1aa3b36997f594a4967808e166173becae)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Get the sum of the transaction output values. +`public int `[`transaction_is_coinbase`](#transaction_8h_1a7a16bc0444fe445d5e690deb5b26783b)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Determine if a transaction is coinbase. +`public int `[`transaction_is_null_non_coinbase`](#transaction_8h_1a9133115f7971f603ebe3d579f290a098)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Determine if a transaction is null and not coinnase. +`public int `[`transaction_is_oversized_coinbase`](#transaction_8h_1a202ed448323427c2bd2bf570da7755f6)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Determine if a transaction is oversized coinbase. +`public int `[`transaction_is_immature`](#transaction_8h_1af59c2b852425cc6defb83564ac93d930)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,size_t target_height)` | Determine if a transaction is immature. +`public int `[`transaction_is_overspent`](#transaction_8h_1a9f0a7d2da797716141c12b17ea961409)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Determine if a transaction is overspent. +`public int `[`transaction_is_double_spend`](#transaction_8h_1abeb082da354f1794b20bde7c59fdeecb)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,int include_unconfirmed)` | Determine if a transaction is double spent. +`public int `[`transaction_is_missing_previous_outputs`](#transaction_8h_1a6aa8bd4e08e142f6a14a4ab702dc8f69)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Determine whether transaction is missing previous outputs. +`public int `[`transaction_is_final`](#transaction_8h_1a516abef95a61b04e9275caaac85a1632)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,size_t block_height,uint32_t block_time)` | Determine if a transaction is final. +`public int `[`transaction_is_locktime_conflict`](#transaction_8h_1a4e24096bfbadeea91e45715186137e7f)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Determine if a transaction incurs in a locktime conflict. +`public size_t `[`transaction_output_count`](#transaction_8h_1a44ce3dcf50895f79b005c4ffd2820358)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Get transaction output count. +`public `[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` `[`transaction_output_nth`](#transaction_8h_1ab85fba65372d0078afedcc839ed50d46)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,size_t n)` | Get the transaction's n-th output. +`public size_t `[`transaction_input_count`](#transaction_8h_1ae6ce6c6592b7a4666592f23050bf51c9)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` | Get transaction input count. +`public `[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` `[`transaction_input_nth`](#transaction_8h_1a58617f586abf033ed1cdaf77e087d538)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,size_t n)` | Get n-th transaction input. +`public `[`word_list_t`](#primitives_8h_1a547ee5b6df76cdddedd5e12dea357036)` `[`word_list_construct`](#word__list_8h_1ac30529cbf0ce5a79d53add1f61c0c90d)`()` | Create a new word list instance. +`public void `[`word_list_add_word`](#word__list_8h_1af359d913e1eb715be21608dbb90ee558)`(`[`word_list_t`](#primitives_8h_1a547ee5b6df76cdddedd5e12dea357036)` word_list,const char * word)` | Add a word to the word list +`public void `[`word_list_destruct`](#word__list_8h_1a47d1b62e1dc307bac37279d213920436)`(`[`word_list_t`](#primitives_8h_1a547ee5b6df76cdddedd5e12dea357036)` word_list)` | Release memory held by word list object. + +## Members + +#### `enum `[`point_kind`](#primitives_8h_1a4de8699f33816d833b0d9a69fb08fc8a) {#primitives_8h_1a4de8699f33816d833b0d9a69fb08fc8a} + +0 = output, 1 = spend + + Values | Descriptions +--------------------------------|--------------------------------------------- +output | +spend | + +#### `public void `[`block_destruct`](#block_8h_1ac0c31d7ecb4f682fac067a179cc468d1)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` {#block_8h_1ac0c31d7ecb4f682fac067a179cc468d1} + +Release the memory held by a block object. + +#### Parameters +* `block` Handle to a block instance + +#### `public int `[`block_is_valid`](#block_8h_1af7395388b4f83298636e05de96b8bb7f)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` {#block_8h_1af7395388b4f83298636e05de96b8bb7f} + +Determine if a block is valid. + +#### Parameters +* `block` Handle to a block instance + +#### Returns +True (non zero) iif the block is valid + +#### `public `[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` `[`block_header`](#block_8h_1aa644a0753e3d370f683883aecc37a199)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` {#block_8h_1aa644a0753e3d370f683883aecc37a199} + +Get the block's header. + +#### Parameters +* `block` Handle to a block instance + +#### Returns +Handle to the block's header. Must be released by calling [header_destruct()](#header_8h_1a1d1d3fc9341337e1bddd2681fdfed682) + +#### `public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`block_hash`](#block_8h_1a30cfad237bdb5bebe5fd7e3b48f3d410)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` {#block_8h_1a30cfad237bdb5bebe5fd7e3b48f3d410} + +Get the block's hash. + +#### Parameters +* `block` Handle to a block instance + +#### Returns +Block hash as a byte array. Must be released by calling delete[] + +#### `public size_t `[`block_transaction_count`](#block_8h_1a7efc8cd7a41f4dfe6286629ab9ebe59b)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` {#block_8h_1a7efc8cd7a41f4dfe6286629ab9ebe59b} + +Get the block's transaction count. + +#### Parameters +* `block` Handle to a block instance + +#### Returns +The amount of transactions that comprise the block + +#### `public `[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` `[`block_transaction_nth`](#block_8h_1a0732e73992d9c4c4789fc54f39e8747a)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block,size_t n)` {#block_8h_1a0732e73992d9c4c4789fc54f39e8747a} + +Get the block's n-th transaction. + +#### Parameters +* `block` Handle to a block instance + +* `n` Index to the desired transaction. Starts at zero (0) for the first one + +#### Returns +Handle to the selected transaction. Must be released by calling [transaction_destruct()](#transaction_8h_1ad32fc27899d84318a183ecf152967570) + +#### `public size_t `[`block_serialized_size`](#block_8h_1a5b8666350465a4501cb3e8002085a2b1)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block,uint32_t version)` {#block_8h_1a5b8666350465a4501cb3e8002085a2b1} + +Get the block's serialized size. + +#### Parameters +* `block` Handle to a block instance + +* `version` The protocol version as a 32-bit integer + +#### Returns +The block's serialized size + +#### `public uint64_t `[`block_subsidy`](#block_8h_1a6c9f4dca5ff1fc402d405e4216a82d86)`(size_t height)` {#block_8h_1a6c9f4dca5ff1fc402d405e4216a82d86} + +Get the block subsidy (miner_reward = block_subsidy + transaction_fees) + +#### Parameters +* `height` The block's height + +#### Returns +The block's subsidy + +#### `public uint64_t `[`block_fees`](#block_8h_1a0ee8cfa6d663b50aff057932efb0eeaa)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` {#block_8h_1a0ee8cfa6d663b50aff057932efb0eeaa} + +Get the block's total transaction fees (miner_reward = block_subsidy + transaction_fees) + +#### Parameters +* `block` Handle to a block instance + +#### Returns +The block's total transaction fees + +#### `public uint64_t `[`block_claim`](#block_8h_1a4a1d431723d6e90f80894bb6b6a9c213)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` {#block_8h_1a4a1d431723d6e90f80894bb6b6a9c213} + +Get the block's claim. + +#### Parameters +* `block` Handle to a block instance + +#### Returns +The block's claim + +#### `public uint64_t `[`block_reward`](#block_8h_1af91de8cf3d009d9bb291f3fdac1c35dd)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block,size_t height)` {#block_8h_1af91de8cf3d009d9bb291f3fdac1c35dd} + +Get the block's miner reward (miner_reward = block_subsidy + transaction_fees) + +#### Parameters +* `block` Handle to a block instance + +* `height` The block's height + +#### Returns +The block's miner reward + +#### `public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`block_generate_merkle_root`](#block_8h_1accd9987fa1b37396e047f6e8b2251c12)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` {#block_8h_1accd9987fa1b37396e047f6e8b2251c12} + +Generate a Merkle root for a block. + +#### Parameters +* `block` Handle to a block instance + +#### Returns +The new Merkle root's hash. Must be released by calling delete[] + +#### `public size_t `[`block_signature_operations`](#block_8h_1a0095ecbd424497725258918fc0c07acc)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` {#block_8h_1a0095ecbd424497725258918fc0c07acc} + +Get the block's signature operations count. + +#### Parameters +* `block` Handle to a block instance + +#### Returns +Amount of block signature operations + +#### `public size_t `[`block_signature_operations_bip16_active`](#block_8h_1adbc5bcd535157b8fca7e9869db80d68d)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block,int bip16_active)` {#block_8h_1adbc5bcd535157b8fca7e9869db80d68d} + +Get the block's BIP0016 signature operations count. + +#### Parameters +* `block` Handle to a block instance + +* `bip16_active` If true (non zero), don't consider inactive operations for the total count + +#### Returns +Amount of BIP0016 block signature operations + +#### `public size_t `[`block_total_inputs`](#block_8h_1aded82b46e51e35812902beec2e60c508)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block,int with_coinbase)` {#block_8h_1aded82b46e51e35812902beec2e60c508} + +Get the block's input count. + +#### Parameters +* `block` Handle to a block instance + +* `with_coinbase` If true (non zero), count coinbase inputs + +#### Returns +Amount of inputs owned by the transaction + +#### `public int `[`block_is_extra_coinbases`](#block_8h_1acda164be7d985af0e920396fd5dbf438)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` {#block_8h_1acda164be7d985af0e920396fd5dbf438} + +Determine if a block has extra coinbases. + +#### Parameters +* `block` Handle to a block instance + +#### Returns +True (non zero) iif the block has extra coinbases + +#### `public int `[`block_is_final`](#block_8h_1aa3b0657e9a9141472d62e61b6ff7800a)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block,size_t height)` {#block_8h_1aa3b0657e9a9141472d62e61b6ff7800a} + +Determine if a block is final. + +#### Parameters +* `block` Handle to a block instance + +* `height` Block height + +#### Returns +True (non zero) iif the block is final + +#### `public int `[`block_is_distinct_transaction_set`](#block_8h_1a2a7648c49fb07ad150013289522e9a62)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` {#block_8h_1a2a7648c49fb07ad150013289522e9a62} + +Determine if a block contains a distinct transaction set. + +#### Parameters +* `block` Handle to a block instance + +#### Returns +True (non zero) iif the block contains a distinct transaction set + +#### `public int `[`block_is_valid_coinbase_claim`](#block_8h_1a18fb299820f406654184facc727f6359)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block,size_t height)` {#block_8h_1a18fb299820f406654184facc727f6359} + +Determine if a block contains a valid coinbase claim. + +#### Parameters +* `block` Handle to a block instance + +* `height` Block height + +#### Returns +True (non zero) iif the block contains a valid coinbase claim + +#### `public int `[`block_is_valid_coinbase_script`](#block_8h_1aa8e9758dd0e41b4ebcf0daef7cb50af2)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block,size_t height)` {#block_8h_1aa8e9758dd0e41b4ebcf0daef7cb50af2} + +Determine if a block contains a valid coinbase script. + +#### Parameters +* `block` Handle to a block instance + +* `height` Block height + +#### Returns +True (non zero) iif the block contains a valid coinbase script + +#### `public int `[`block_is_internal_double_spend`](#block_8h_1a7c4a0d1bd346fe47a8f0022427b47b9c)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` {#block_8h_1a7c4a0d1bd346fe47a8f0022427b47b9c} + +Determine if a block contains an internal double spend. + +#### Parameters +* `block` Handle to a block instance + +#### Returns +True (non zero) iif the block contains an internal double spend + +#### `public int `[`block_is_valid_merkle_root`](#block_8h_1ae3e37f3180a5403625db8bdbe6d105ee)`(`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` block)` {#block_8h_1ae3e37f3180a5403625db8bdbe6d105ee} + +Determine if a block has a valid Merkle root. + +#### Parameters +* `block` Handle to a block instance + +#### Returns +True (non zero) iif the block has a valid Merkle root + +#### `public `[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` `[`compact_block_header`](#compact__block_8h_1a8cf34d1187d38c7d6201453289a19d5c)`(`[`compact_block_t`](#primitives_8h_1a43ccacc67cf17b4bf244f421228028ad)` block)` {#compact__block_8h_1a8cf34d1187d38c7d6201453289a19d5c} + +Get compact block header. + +#### Parameters +* `block` Handle to a compact block instance + +#### Returns +Handle to the compact block's header. Must be released by calling [header_destruct()](#header_8h_1a1d1d3fc9341337e1bddd2681fdfed682) + +#### `public int `[`compact_block_is_valid`](#compact__block_8h_1accb0d739d132cbed90dc3495886a05b0)`(`[`compact_block_t`](#primitives_8h_1a43ccacc67cf17b4bf244f421228028ad)` block)` {#compact__block_8h_1accb0d739d132cbed90dc3495886a05b0} + +Determine if a compact block is valid. + +#### Parameters +* `block` Handle to a compact block instance + +#### Returns +True (non zero) iif the compact block is valid + +#### `public size_t `[`compact_block_serialized_size`](#compact__block_8h_1aa96e45a0eb41a7d8bcfe03340d8e502b)`(`[`compact_block_t`](#primitives_8h_1a43ccacc67cf17b4bf244f421228028ad)` block,uint32_t version)` {#compact__block_8h_1aa96e45a0eb41a7d8bcfe03340d8e502b} + +Get a compact block's serialized size. + +#### Parameters +* `block` Handle to a compact block instance + +* `version` Protocol version + +#### Returns +The compact block's serialized size + +#### `public size_t `[`compact_block_transaction_count`](#compact__block_8h_1ae0785b7c6e06c6cb188c94fa0da5b98c)`(`[`compact_block_t`](#primitives_8h_1a43ccacc67cf17b4bf244f421228028ad)` block)` {#compact__block_8h_1ae0785b7c6e06c6cb188c94fa0da5b98c} + +Get the compact block's transaction count. + +#### Parameters +* `block` Handle to a compact block instance + +#### Returns +Amount of transactions that comprise the compact block + +#### `public `[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` `[`compact_block_transaction_nth`](#compact__block_8h_1ad271eeb9ab8a4148a4065e380cb8213b)`(`[`compact_block_t`](#primitives_8h_1a43ccacc67cf17b4bf244f421228028ad)` block,size_t n)` {#compact__block_8h_1ad271eeb9ab8a4148a4065e380cb8213b} + +Get a compact block's n-th transaction. + +#### Parameters +* `block` Handle to a compact block instance + +* `n` Index to the transaction inside the block. Starts at 0 (zero) for the first one + +#### Returns +Handle to the n-th transaction. Must be released by calling [transaction_destruct()](#transaction_8h_1ad32fc27899d84318a183ecf152967570) + +#### `public uint64_t `[`compact_block_nonce`](#compact__block_8h_1aebea00334de2af9b07f9e6a9acd333d7)`(`[`compact_block_t`](#primitives_8h_1a43ccacc67cf17b4bf244f421228028ad)` block)` {#compact__block_8h_1aebea00334de2af9b07f9e6a9acd333d7} + +Get compact block's nonce. + +#### Parameters +* `block` Handle to a compact block instance + +#### Returns +Compact block's nonce + +#### `public void `[`compact_block_destruct`](#compact__block_8h_1ace80b5f64b9e64e7c53c65d98a3cae4c)`(`[`compact_block_t`](#primitives_8h_1a43ccacc67cf17b4bf244f421228028ad)` block)` {#compact__block_8h_1ace80b5f64b9e64e7c53c65d98a3cae4c} + +Release memory held by compact block instance. + +#### Parameters +* `block` Handle to a compact block instance + +#### `public void `[`compact_block_reset`](#compact__block_8h_1a24b85a581e03ba42eafbe80f276bf01a)`(`[`compact_block_t`](#primitives_8h_1a43ccacc67cf17b4bf244f421228028ad)` block)` {#compact__block_8h_1a24b85a581e03ba42eafbe80f276bf01a} + +Reset compact block. + +#### Parameters +* `block` Handle to a compact block instance + +#### `public `[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` `[`executor_construct`](#executor__c_8h_1aed246db742bdb2aeee6842a8743ea094)`(char const * path,FILE * sout,FILE * serr)` {#executor__c_8h_1aed246db742bdb2aeee6842a8743ea094} + +Creates an executor instance, which controls a node in the network. + +#### Parameters +* `path` Points to node configuration file + +* `sout` FILE* to where standard output will be redirected + +* `serr` FILE* to which standard error output will be redirected + +#### Returns +A new executor instance. Must be released manually by calling [executor_destruct()](#executor__c_8h_1a963f4bbda682b0bdf66d73a374a1ac89) + +#### `public `[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` `[`executor_construct_fd`](#executor__c_8h_1ad9e4e0f23310637271e442585696de0c)`(char const * path,int sout_fd,int serr_fd)` {#executor__c_8h_1ad9e4e0f23310637271e442585696de0c} + +Creates an executor instance, which controls a node in the network. + +#### Parameters +* `path` Points to node configuration file + +* `sout_fd` File descriptor to where standard output will be redirected + +* `serr_fd` File descriptor to which standard error output will be redirected + +#### Returns +A new executor instance. Must be released manually by calling [executor_destruct()](#executor__c_8h_1a963f4bbda682b0bdf66d73a374a1ac89) + +#### `public void `[`executor_destruct`](#executor__c_8h_1a963f4bbda682b0bdf66d73a374a1ac89)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec)` {#executor__c_8h_1a963f4bbda682b0bdf66d73a374a1ac89} + +Destroys an executor instance (it only releases memory) + +#### Parameters +* `exec` Handle to executor instance + +#### `public void `[`executor_run`](#executor__c_8h_1a53815abff7a75a5c963b342f8aa2f8bf)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`run_handler_t`](#primitives_8h_1a042c0a527cc2744c80e2565a7b7beb9e)` handler)` {#executor__c_8h_1a53815abff7a75a5c963b342f8aa2f8bf} + +After [executor_initchain()](#executor__c_8h_1a5edfd9a2012e7345e9908a6d80baeaf6) has been called, the node can be started using this function. This is an asynchronous function, hence the callback parameter. + +#### Parameters +* `exec` Handle to executor instance + +* `handler` Callback which will be invoked when the node starts running. It must point to a C function matching the signature defined by run_handler_t + +**See also**: [run_handler_t](#primitives_8h_1a042c0a527cc2744c80e2565a7b7beb9e) + +#### `public int `[`executor_run_wait`](#executor__c_8h_1abd814e409c84aac34363c21452cabd58)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec)` {#executor__c_8h_1abd814e409c84aac34363c21452cabd58} + +After [executor_initchain()](#executor__c_8h_1a5edfd9a2012e7345e9908a6d80baeaf6) has been called, the node can be started using this function. This is a synchronous function, so it will block until node has started running. + +#### Parameters +* `exec` Handle to executor instance + +#### Returns +Error code. Zero for success, non zero for error. + +#### `public int `[`executor_initchain`](#executor__c_8h_1a5edfd9a2012e7345e9908a6d80baeaf6)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec)` {#executor__c_8h_1a5edfd9a2012e7345e9908a6d80baeaf6} + +Initializes the chain for this node. It only creates the structure; the blockchain won't be synced. + +#### Parameters +* `exec` Handle to executor instance + +#### Returns +Error code. Zero for success, non zero for error. + +#### `public void `[`executor_stop`](#executor__c_8h_1a80a0e1814db0a389e0ae7ba1a43c78e8)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec)` {#executor__c_8h_1a80a0e1814db0a389e0ae7ba1a43c78e8} + +Stops execution of the node. + +#### Parameters +* `exec` Handle to executor instance + +#### `public void `[`fetch_last_height`](#executor__c_8h_1a83a045615b9be929f3331ef5302ec772)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`last_height_fetch_handler_t`](#primitives_8h_1a7319bd077428255061dc7c773ebc0cc4)` handler)` {#executor__c_8h_1a83a045615b9be929f3331ef5302ec772} + +Get the current blockchain height. + +#### Parameters +* `exec` Handle to executor instance + +* `handler` Callback which will be invoked when the blockchain height is retrieved from the network, or retrieval fails. This parameter must point to a C function matching the signature defined by last_height_fetch_handler_t + +**See also**: [last_height_fetch_handler_t](#primitives_8h_1a7319bd077428255061dc7c773ebc0cc4) + +#### `public int `[`get_last_height`](#executor__c_8h_1a791b814d3928a00faa6138ea2d33c5b9)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,size_t * height)` {#executor__c_8h_1a791b814d3928a00faa6138ea2d33c5b9} + +Get the current blockchain height. This is the synchronous version of [fetch_last_height()](#executor__c_8h_1a83a045615b9be929f3331ef5302ec772), so it will block until height is retrieved from the network, or an error occurs. + +#### Parameters +* `exec` Handle to executor instance + +* `height` Current blockchain height + +#### Returns +Error code. Zero for success, non zero for error + +#### `public void `[`fetch_block_height`](#executor__c_8h_1a903aec1424b51b8810273cf5642b70d0)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,`[`block_height_fetch_handler_t`](#primitives_8h_1a7f26119f3693225e3698e80e8d7e64c9)` handler)` {#executor__c_8h_1a903aec1424b51b8810273cf5642b70d0} + +Given a block, get its height in the blockchain. + +#### Parameters +* `exec` Handle to executor instance + +* `hash` Block hash, which univocally identifies a single block, as an array of bytes + +* `handler` Callback which will be invoked when the block height is retrieved from the network, or retrieval fails. This parameter must point to a C function matching the signature defined by block_height_fetch_handler_t + +**See also**: [block_height_fetch_handler_t](#primitives_8h_1a7f26119f3693225e3698e80e8d7e64c9) + +#### `public int `[`get_block_height`](#executor__c_8h_1a0c140100f1eefa4dc6707e93568fdcc1)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,size_t * height)` {#executor__c_8h_1a0c140100f1eefa4dc6707e93568fdcc1} + +Given a block, get its height in the blockchain. This is the synchronous version of [fetch_block_height()](#executor__c_8h_1a903aec1424b51b8810273cf5642b70d0), so it will block until height is retrieved from the network, or an error occurs. + +#### Parameters +* `exec` Handle to executor instance + +* `hash` Block hash, which univocally identifies a single block, as an array of bytes + +* `height` Block height + +#### Returns +Error code. Zero for success, non zero for error + +#### `public void `[`fetch_block_header_by_height`](#executor__c_8h_1ae4d491f18285c2b31b6261683ef5679b)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,size_t height,`[`block_header_fetch_handler_t`](#primitives_8h_1a175320d3fdee884d5b1daba1f51af6cf)` handler)` {#executor__c_8h_1ae4d491f18285c2b31b6261683ef5679b} + +Given a height in the blockchain, retrieve its block's header. + +#### Parameters +* `exec` Handle to executor instance + +* `height` The height which identifies the desired block + +* `handler` Callback which will be invoked when the block header is retrieved from the network, or retrieval fails. This parameter must point to a C function matching the signature defined by block_header_fetch_handler_t + +**See also**: [block_header_fetch_handler_t](#primitives_8h_1a175320d3fdee884d5b1daba1f51af6cf) + +#### `public int `[`get_block_header_by_height`](#executor__c_8h_1a2b2cb61fd05544b98a8829c6fc357a06)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,size_t height,`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` * header,size_t * ret_height)` {#executor__c_8h_1a2b2cb61fd05544b98a8829c6fc357a06} + +Given a height in the blockchain, retrieve its block's header. This is the synchronous version of [fetch_block_header_by_height()](#executor__c_8h_1ae4d491f18285c2b31b6261683ef5679b), so it will block until the header is retrieved from the network, or an error occurs. + +#### Parameters +* `exec` Handle to executor instance + +* `height` The height which identifies the desired block + +* `header` The block's header. It must be released by calling [header_destruct()](#header_8h_1a1d1d3fc9341337e1bddd2681fdfed682) + +* `ret_height` The block's height + +#### Returns +Error code. Zero for success, non zero for error + +#### `public void `[`fetch_block_header_by_hash`](#executor__c_8h_1a660eb713c231f3daa2a1cfb5fbfa4bd4)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,`[`block_header_fetch_handler_t`](#primitives_8h_1a175320d3fdee884d5b1daba1f51af6cf)` handler)` {#executor__c_8h_1a660eb713c231f3daa2a1cfb5fbfa4bd4} + +Given a block hash, retrieve its header. + +#### Parameters +* `exec` Handle to executor instance + +* `hash` The hash which identifies the desired block + +* `handler` Callback which will be invoked when the block header is retrieved from the network, or retrieval fails. This parameter must point to a C function matching the signature defined by block_header_fetch_handler_t + +**See also**: [block_header_fetch_handler_t](#primitives_8h_1a175320d3fdee884d5b1daba1f51af6cf) + +#### `public int `[`get_block_header_by_hash`](#executor__c_8h_1a21e7310364624f505d7e16190fe1fa3c)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` * header,size_t * ret_height)` {#executor__c_8h_1a21e7310364624f505d7e16190fe1fa3c} + +Given a block hash, retrieve its header. This is the synchronous version of [fetch_block_header_by_height()](#executor__c_8h_1ae4d491f18285c2b31b6261683ef5679b), so it will block until the header is retrieved from the network, or an error occurs. + +#### Parameters +* `exec` Handle to executor instance + +* `hash` The hash which identifies the desired block + +* `header` Block header + +* `ret_height` Block height + +#### Returns +Error code. Zero for success, non zero for error + +#### `public void `[`fetch_block_by_height`](#executor__c_8h_1a1ce9ccf736baf9f52e26093e7787f7a3)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,size_t height,`[`block_fetch_handler_t`](#primitives_8h_1a8c1fb1e052b08b1188d614222a9de9b2)` handler)` {#executor__c_8h_1a1ce9ccf736baf9f52e26093e7787f7a3} + +Given a block's height, retrieve the block. + +#### Parameters +* `exec` Handle to executor instance + +* `height` The height which identifies the desired block + +* `handler` Callback which will be invoked when the block is retrieved from the network, or retrieval fails. This parameter must point to a C function matching the signature defined by block_fetch_handler_t + +**See also**: [block_fetch_handler_t](#primitives_8h_1a8c1fb1e052b08b1188d614222a9de9b2) + +#### `public int `[`get_block_by_height`](#executor__c_8h_1a1887b7fb6d869838e66afd19a09b50d2)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,size_t height,`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` * block,size_t * ret_height)` {#executor__c_8h_1a1887b7fb6d869838e66afd19a09b50d2} + +Given a block's height, retrieve the block. This is the synchronous version of [fetch_block_by_height()](#executor__c_8h_1a1ce9ccf736baf9f52e26093e7787f7a3), so it will block until the block is retrieved from the network, or an error occurs. + +#### Parameters +* `exec` Handle to executor instance + +* `height` The height which identifies the desired block + +* `block` Block + +* `ret_height` Block height + +#### Returns +Error code. Zero for success, non zero for error + +#### `public void `[`fetch_block_by_hash`](#executor__c_8h_1a0e2e7826e0ed92f46f06fb7c50d0b5e2)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,`[`block_fetch_handler_t`](#primitives_8h_1a8c1fb1e052b08b1188d614222a9de9b2)` handler)` {#executor__c_8h_1a0e2e7826e0ed92f46f06fb7c50d0b5e2} + +Given a block's hash, retrieve the block. + +#### Parameters +* `exec` Handle to executor instance + +* `hash` The hash which identifies the desired block + +* `handler` Callback which will be invoked when the block is retrieved from the network, or retrieval fails. This parameter must point to a C function matching the signature defined by block_fetch_handler_t + +**See also**: [block_fetch_handler_t](#primitives_8h_1a8c1fb1e052b08b1188d614222a9de9b2) + +#### `public int `[`get_block_by_hash`](#executor__c_8h_1a13e08557af5950a19019e4ff55791d12)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,`[`block_t`](#primitives_8h_1a8ed39cb12068667c597f544ec838ccc4)` * block,size_t * ret_height)` {#executor__c_8h_1a13e08557af5950a19019e4ff55791d12} + +Given a block's hash, retrieve the block. This is the synchronous version of [fetch_block_by_height()](#executor__c_8h_1a1ce9ccf736baf9f52e26093e7787f7a3), so it will block until the block is retrieved from the network, or an error occurs. + +#### Parameters +* `exec` Handle to executor instance + +* `hash` The hash which identifies the desired block + +* `block` Handle to block. Must be released by calling [block_destruct()](#block_8h_1ac0c31d7ecb4f682fac067a179cc468d1) + +* `ret_height` Block height + +#### Returns +Error code. Zero for success, non zero for error + +#### `public void `[`fetch_merkle_block_by_height`](#executor__c_8h_1a8133807dfb7628a247f191608976c47b)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,size_t height,`[`merkle_block_fetch_handler_t`](#primitives_8h_1aff6e1e0990f9e15ea36d9a1ce64890ff)` handler)` {#executor__c_8h_1a8133807dfb7628a247f191608976c47b} + +Given a Merkle block's height, retrieve the block. + +#### Parameters +* `exec` Handle to executor instance + +* `height` The height which identifies the desired block + +* `handler` Callback which will be invoked when the block is retrieved from the network, or retrieval fails. This parameter must point to a C function matching the signature defined by merkle_block_fetch_handler_t + +**See also**: [merkle_block_fetch_handler_t](#primitives_8h_1aff6e1e0990f9e15ea36d9a1ce64890ff) + +#### `public void `[`fetch_merkle_block_by_hash`](#executor__c_8h_1aca145cfaa6db94792255beef98e57b94)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,`[`merkle_block_fetch_handler_t`](#primitives_8h_1aff6e1e0990f9e15ea36d9a1ce64890ff)` handler)` {#executor__c_8h_1aca145cfaa6db94792255beef98e57b94} + +Given a Merkle block's hash, retrieve the block. + +#### Parameters +* `exec` Handle to executor instance + +* `hash` The hash which identifies the desired block + +* `handler` Callback which will be invoked when the block is retrieved from the network, or retrieval fails. This parameter must point to a C function matching the signature defined by merkle_block_fetch_handler_t + +**See also**: [merkle_block_fetch_handler_t](#primitives_8h_1aff6e1e0990f9e15ea36d9a1ce64890ff) + +#### `public void `[`fetch_compact_block_by_height`](#executor__c_8h_1a553b3ba0d2df8d9c3cc0d544f570d976)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,size_t height,`[`compact_block_fetch_handler_t`](#primitives_8h_1ae4895924faf7b39c24a050618ebf6c51)` handler)` {#executor__c_8h_1a553b3ba0d2df8d9c3cc0d544f570d976} + +Given a compact block's height, retrieve the block. + +#### Parameters +* `exec` Handle to executor instance + +* `height` The height which identifies the desired block + +* `handler` Callback which will be invoked when the block is retrieved from the network, or retrieval fails. This parameter must point to a C function matching the signature defined by compact_block_fetch_handler_t + +**See also**: [compact_block_fetch_handler_t](#primitives_8h_1ae4895924faf7b39c24a050618ebf6c51) + +#### `public void `[`fetch_compact_block_by_hash`](#executor__c_8h_1a7a2060ab5f19214db5431646c98a09b8)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,`[`compact_block_fetch_handler_t`](#primitives_8h_1ae4895924faf7b39c24a050618ebf6c51)` handler)` {#executor__c_8h_1a7a2060ab5f19214db5431646c98a09b8} + +Given a compact block's hash, retrieve the block. + +#### Parameters +* `exec` Handle to executor instance + +* `hash` The hash which identifies the desired block + +* `handler` Callback which will be invoked when the block is retrieved from the network, or retrieval fails. This parameter must point to a C function matching the signature defined by compact_block_fetch_handler_t + +**See also**: [compact_block_fetch_handler_t](#primitives_8h_1ae4895924faf7b39c24a050618ebf6c51) + +#### `public void `[`fetch_transaction`](#executor__c_8h_1a99a0cbcfe63b6381c738d21bd7826b3d)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,int require_confirmed,`[`transaction_fetch_handler_t`](#primitives_8h_1ae0808043043d84636e3a2e3c754b8fd6)` handler)` {#executor__c_8h_1a99a0cbcfe63b6381c738d21bd7826b3d} + +Given a transaction hash, retrieve it (optionally requiring it to be confirmed) + +#### Parameters +* `exec` Handle to executor instance + +* `hash` The hash which identifies the desired transaction + +* `require_confirmed` If this is set to true (non zero), the transaction will only be fetched if it has already been confirmed + +* `handler` Callback which will be invoked when the transaction is retrieved from the network, or retrieval fails. This parameter must point to a C function matching the signature defined by transaction_fetch_handler_t + +**See also**: [transaction_fetch_handler_t](#primitives_8h_1ae0808043043d84636e3a2e3c754b8fd6) + +#### `public int `[`get_transaction`](#executor__c_8h_1a7f74db96f0bd243d3568c771896d3a24)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,int require_confirmed,`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` * transaction,size_t * ret_height,size_t * index)` {#executor__c_8h_1a7f74db96f0bd243d3568c771896d3a24} + +Given a transaction's hash, retrieve it This is the synchronous version of [fetch_transaction()](#executor__c_8h_1a99a0cbcfe63b6381c738d21bd7826b3d), so it will block until the transaction is retrieved from the network, or an error occurs. + +#### Parameters +* `exec` Handle to executor instance + +* `hash` The hash which identifies the desired transaction + +* `require_confirmed` If this is set to true (non zero), the transaction will only be fetched if it has already been confirmed + +* `transaction` Block + +* `ret_height` Block height + +* `index` Transaction index inside the block (zero-based, i.e. the first one is zero) + +#### Returns +Error code. Zero for success, non zero for error + +#### `public void `[`fetch_transaction_position`](#executor__c_8h_1a699c29f962fa7c4302ee04b21cf82a9a)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,int require_confirmed,`[`transaction_index_fetch_handler_t`](#primitives_8h_1a83733f3195e3e03a0d9f4cc822b48a3d)` handler)` {#executor__c_8h_1a699c29f962fa7c4302ee04b21cf82a9a} + +Given a transaction hash, retrieve its position inside the block (optionally requiring it to be confirmed) + +#### Parameters +* `exec` Handle to executor instance + +* `hash` The hash which identifies the desired transaction + +* `require_confirmed` If this is set to true (non zero), the transaction will only be fetched if it has already been confirmed + +* `handler` Callback which will be invoked when the transaction position is retrieved from the network, or retrieval fails. This parameter must point to a C function matching the signature defined by transaction_index_fetch_handler_t + +**See also**: [transaction_index_fetch_handler_t](#primitives_8h_1a83733f3195e3e03a0d9f4cc822b48a3d) + +#### `public void `[`fetch_output`](#executor__c_8h_1afcc2cb87a88aabb6a712435cee9abc9a)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,uint32_t index,int require_confirmed,`[`output_fetch_handler_t`](#primitives_8h_1aefbd8dfda0d008880de7c60bcf23dde9)` handler)` {#executor__c_8h_1afcc2cb87a88aabb6a712435cee9abc9a} + +Given an output hash, retrieve it (optionally requiring it to be confirmed) + +#### Parameters +* `exec` Handle to executor instance + +* `hash` The hash which identifies the output's transaction + +* `index` The index which identifies the output among the transaction's other outputs + +* `require_confirmed` If this is set to true (non zero), the output will only be fetched if it has already been confirmed + +* `handler` Callback which will be invoked when the output is retrieved from the network, or retrieval fails. This parameter must point to a C function matching the signature defined by output_fetch_handler_t + +**See also**: [output_fetch_handler_t](#primitives_8h_1aefbd8dfda0d008880de7c60bcf23dde9) + +#### `public int `[`get_output`](#executor__c_8h_1a8d35fe3911046137e8cace26f8a3c938)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` hash,uint32_t index,int require_confirmed,`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` * output)` {#executor__c_8h_1a8d35fe3911046137e8cace26f8a3c938} + +Given an output's hash, retrieve it This is the synchronous version of [fetch_output()](#executor__c_8h_1afcc2cb87a88aabb6a712435cee9abc9a), so it will block until the output is retrieved from the network, or an error occurs. + +#### Parameters +* `exec` Handle to executor instance + +* `hash` The hash which identifies the desired output + +* `index` The index which identifies the output among the transaction's other outputs + +* `require_confirmed` If this is set to true (non zero), the output will only be fetched if it has already been confirmed + +* `output` Handle to output. Must be released by calling [output_destruct()](#output_8h_1a974f0d91520ed93250bcd56e2d921590) + +#### Returns +Error code. Zero for success, non zero for error + +#### `public void `[`fetch_spend`](#executor__c_8h_1a4966f126f69c313903cbf0f46be79f9d)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`output_point_t`](#primitives_8h_1ad4d5035e7d5ca4f6a10eafdfdfd2e074)` outpoint,`[`spend_fetch_handler_t`](#primitives_8h_1aae597f1c61dc1dc585f5425375300ce3)` handler)` {#executor__c_8h_1a4966f126f69c313903cbf0f46be79f9d} + +Given an output point, retrieve its spend. + +#### Parameters +* `exec` Handle to executor instance + +* `outpoint` The output point whose spend we wish to retrieve + +* `handler` Callback which will be invoked when the spend is retrieved from the network, or retrieval fails. This parameter must point to a C function matching the signature defined by spend_fetch_handler_t + +**See also**: [spend_fetch_handler_t](#primitives_8h_1aae597f1c61dc1dc585f5425375300ce3) + +#### `public void `[`fetch_history`](#executor__c_8h_1a6ca41df13a8c7d67781d3a6005841ba6)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`payment_address_t`](#primitives_8h_1acc9e0ae61a6bf90f01911484e4ede07b)` address,size_t limit,size_t from_height,`[`history_fetch_handler_t`](#primitives_8h_1aee0367afd480cf2771d49690c567c25a)` handler)` {#executor__c_8h_1a6ca41df13a8c7d67781d3a6005841ba6} + +Given a payment address, a starting height and an entry limit, retrieve its transaction history. + +#### Parameters +* `exec` Handle to executor instance + +* `address` Payment address whose history we want to fetch + +* `limit` Maximum entries to fetch + +* `from_height` Starting blockchain height for the history + +* `handler` Callback which will be invoked when the history is retrieved from the network, or retrieval fails. This parameter must point to a C function matching the signature defined by history_fetch_handler_t + +**See also**: [history_fetch_handler_t](#primitives_8h_1aee0367afd480cf2771d49690c567c25a) + +#### `public int `[`get_history`](#executor__c_8h_1a1760fe0ef7ec0479230bf77ca7a2ea21)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`payment_address_t`](#primitives_8h_1acc9e0ae61a6bf90f01911484e4ede07b)` address,size_t limit,size_t from_height,`[`history_compact_list_t`](#primitives_8h_1aa9b635e04d3d0e124549cbef8b147638)` * out_history)` {#executor__c_8h_1a1760fe0ef7ec0479230bf77ca7a2ea21} + +Given a payment address, a starting height and an entry limit, retrieve its transaction history This is the synchronous version of [fetch_history()](#executor__c_8h_1a6ca41df13a8c7d67781d3a6005841ba6), so it will block until the history is retrieved from the network, or an error occurs. + +#### Parameters +* `exec` Handle to executor instance + +* `address` Payment address whose history we want to fetch + +* `limit` Maximum entries to fetch + +* `from_height` Starting blockchain height for the history + +* `out_history` Handle to history. Must be released by calling [history_compact_list_destruct()](#history__compact__list_8h_1aec9ce8654f6d88baf7deab18764e9b52) + +#### Returns +Error code. Zero for success, non zero for error + +#### `public `[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` `[`hex_to_tx`](#executor__c_8h_1a8af262d3a75ff3da484cbbccac8a987a)`(char const * tx_hex)` {#executor__c_8h_1a8af262d3a75ff3da484cbbccac8a987a} + +Converts a raw transaction hex string to a transaction object. + +#### Parameters +* `tx_hex` Raw transaction hex string + +#### Returns +Handle to new transaction object built from the hex string. Must be released by calling [transaction_destruct()](#transaction_8h_1ad32fc27899d84318a183ecf152967570) + +#### `public void `[`validate_tx`](#executor__c_8h_1a26fae1c08f21b9f8097e944ebc8ebcc4)`(`[`executor_t`](#primitives_8h_1a383e6acdb0d5f5df837fc1838b71fc51)` exec,`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` tx,`[`validate_tx_handler_t`](#primitives_8h_1a4a5ad506c3c92b9308072dcc1815ec17)` handler)` {#executor__c_8h_1a26fae1c08f21b9f8097e944ebc8ebcc4} + +Validates a new transaction (has not been added to the blockchain yet) + +#### Parameters +* `exec` Handle to executor instance + +* `tx` Transaction to validate + +* `handler` Callback which will be invoked when the history is retrieved from the network, or retrieval fails. This parameter must point to a C function matching the signature defined by validate_tx_handler_t + +**See also**: [validate_tx_handler_t](#primitives_8h_1a4a5ad506c3c92b9308072dcc1815ec17) + +#### `public `[`long_hash_t`](#primitives_8h_1a15a7913e47813e6707bf348da7203f1a)` `[`wallet_mnemonics_to_seed`](#executor__c_8h_1abfdab2c4350be9e094478db62f440547)`(`[`word_list_t`](#primitives_8h_1a547ee5b6df76cdddedd5e12dea357036)` mnemonics)` {#executor__c_8h_1abfdab2c4350be9e094478db62f440547} + +Convert a set of keywords/mnemonics to an HD wallet seed. + +#### Parameters +* `mnemonics` List of keywords/mnemonics + +#### Returns +Handle to long_hash object containing the seed. Must be released by calling [long_hash_destroy()](#executor__c_8h_1a636893dd40262d359bde53923e0a5d1c) + +#### `public void `[`long_hash_destroy`](#executor__c_8h_1a636893dd40262d359bde53923e0a5d1c)`(`[`long_hash_t`](#primitives_8h_1a15a7913e47813e6707bf348da7203f1a)` ptr)` {#executor__c_8h_1a636893dd40262d359bde53923e0a5d1c} + +Release the memory held by a long hash object. + +#### Parameters +* `ptr` Handle to long hash object + +#### `public void `[`header_destruct`](#header_8h_1a1d1d3fc9341337e1bddd2681fdfed682)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` {#header_8h_1a1d1d3fc9341337e1bddd2681fdfed682} + +Releases memory held by the header object. + +#### Parameters +* `header` Handle to the header instance + +#### `public int `[`header_is_valid`](#header_8h_1adaabb8aadd2c899fc4c7361532b1fd8e)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` {#header_8h_1adaabb8aadd2c899fc4c7361532b1fd8e} + +Determine if the header is valid. + +#### Parameters +* `header` Handle to a header instance + +#### Returns +True (non zero) iif the header is valid + +#### `public uint32_t `[`header_version`](#header_8h_1a59dc1762a22e8a9ee84c66e20660767b)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` {#header_8h_1a59dc1762a22e8a9ee84c66e20660767b} + +Get header version. + +#### Parameters +* `header` Handle to a header instance + +#### Returns +Header version + +#### `public void `[`header_set_version`](#header_8h_1af95ba2aea724401b648863129ab40a02)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header,uint32_t version)` {#header_8h_1af95ba2aea724401b648863129ab40a02} + +Set a header's version. + +#### Parameters +* `header` Handle to a header instance + +* `version` New version value + +#### `public uint32_t `[`header_timestamp`](#header_8h_1aa72c883fde1a10067725e0772c6e687f)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` {#header_8h_1aa72c883fde1a10067725e0772c6e687f} + +Get header timestamp. + +#### Parameters +* `header` Handle to a header instance + +#### Returns +Header timestamp + +#### `public void `[`header_set_timestamp`](#header_8h_1a29d0a46719548d37c95fc4e1a456353a)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header,uint32_t timestamp)` {#header_8h_1a29d0a46719548d37c95fc4e1a456353a} + +Set header timestamp. + +#### Parameters +* `header` Handle to a header instance + +* `timestamp` New header timestamp value + +#### `public uint32_t `[`header_bits`](#header_8h_1a6a505d7f8f1137fe68b6b096ed35a15a)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` {#header_8h_1a6a505d7f8f1137fe68b6b096ed35a15a} + +Get header bits. + +#### Parameters +* `header` Handle to a header instance + +#### Returns +Header bits + +#### `public void `[`header_set_bits`](#header_8h_1ad9acf477b496b3d6d632b70483dfad81)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header,uint32_t bits)` {#header_8h_1ad9acf477b496b3d6d632b70483dfad81} + +Set header bits. + +#### Parameters +* `header` Handle to a header instance + +* `bits` New header bits value + +#### `public uint32_t `[`header_nonce`](#header_8h_1acb3466f0d21884c5ba4c272571440610)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` {#header_8h_1acb3466f0d21884c5ba4c272571440610} + +Get header nonce. + +#### Parameters +* `header` Handle to a header instance + +#### Returns +Header nonce + +#### `public void `[`header_set_nonce`](#header_8h_1ab4dd1bb2ed0a537cf237e7dc82184d0c)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header,uint32_t nonce)` {#header_8h_1ab4dd1bb2ed0a537cf237e7dc82184d0c} + +Set header nonce +#### Parameters +* `header` Handle to a header instance + +* `nonce` New header nonce value + +#### `public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`header_previous_block_hash`](#header_8h_1ac048f31bf04639f83e5be544adf9b977)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` {#header_8h_1ac048f31bf04639f83e5be544adf9b977} + +Get previous block hash. + +#### Parameters +* `header` Handle to a header instance + +#### `public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`header_merkle`](#header_8h_1af0f199ca6fed2c5cc37fedfe5dd86b47)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` {#header_8h_1af0f199ca6fed2c5cc37fedfe5dd86b47} + +Get header Merkle. + +#### Parameters +* `header` Handle to a header instance + +#### Returns +Header Merkle hash. Must be released by calling delete[] + +#### `public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`header_hash`](#header_8h_1a625887dacbb1b408e292e0ff6a5638fc)`(`[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` header)` {#header_8h_1a625887dacbb1b408e292e0ff6a5638fc} + +Get header hash. + +#### Parameters +* `header` Handle to a header instance + +#### Returns +Header hash as byte array. Must be released by calling delete[] + +#### `public `[`point_kind_t`](#primitives_8h_1a6f08d747fe788aa53ad4e70e58230078)` `[`history_compact_get_point_kind`](#history__compact_8h_1ad821d566985946fe24bc56f95d3a89c2)`(`[`history_compact_t`](#primitives_8h_1afecbcaff5ab6fec4cda05ca77abb093d)` history)` {#history__compact_8h_1ad821d566985946fe24bc56f95d3a89c2} + +Get the entry's point kind. + +#### Parameters +* `history` Handle to a history entry instance + +#### Returns +Entry's point kind + +#### `public `[`point_t`](#primitives_8h_1af6e7950f472a081d958eb8519843d38b)` `[`history_compact_get_point`](#history__compact_8h_1a86510b343ae158fb7ceefbdbdb92a304)`(`[`history_compact_t`](#primitives_8h_1afecbcaff5ab6fec4cda05ca77abb093d)` history)` {#history__compact_8h_1a86510b343ae158fb7ceefbdbdb92a304} + +Get the entry's point. + +#### Parameters +* `history` Handle to a history entry instance + +#### Returns +Entry's point + +#### `public uint32_t `[`history_compact_get_height`](#history__compact_8h_1abbe2e7a92e48a0a32b261bcdfd723f07)`(`[`history_compact_t`](#primitives_8h_1afecbcaff5ab6fec4cda05ca77abb093d)` history)` {#history__compact_8h_1abbe2e7a92e48a0a32b261bcdfd723f07} + +Get the height of history entry in the blockchain. + +#### Parameters +* `history` Handle to a history entry instance + +#### Returns +Entry height in the blockchain + +#### `public uint64_t `[`history_compact_get_value_or_previous_checksum`](#history__compact_8h_1a3421ce4d489fbda735d8de833bd1e090)`(`[`history_compact_t`](#primitives_8h_1afecbcaff5ab6fec4cda05ca77abb093d)` history)` {#history__compact_8h_1a3421ce4d489fbda735d8de833bd1e090} + +Get the entry's value. + +#### Parameters +* `history` Handle to a history entry instance + +#### Returns +Entry value, which can be a Satoshi value if point kind is output, or the previous entry's checksum if point kind is spend + +#### `public void `[`history_compact_list_destruct`](#history__compact__list_8h_1aec9ce8654f6d88baf7deab18764e9b52)`(`[`history_compact_list_t`](#primitives_8h_1aa9b635e04d3d0e124549cbef8b147638)` history_compact_list)` {#history__compact__list_8h_1aec9ce8654f6d88baf7deab18764e9b52} + +Release memory held by a history compact list instance. + +#### Parameters +* `history_compact_list` Handle to a history compact list instance + +#### `public size_t `[`history_compact_list_count`](#history__compact__list_8h_1a9e3ccd8686469993bb94a73ceb3bac65)`(`[`history_compact_list_t`](#primitives_8h_1aa9b635e04d3d0e124549cbef8b147638)` history_compact_list)` {#history__compact__list_8h_1a9e3ccd8686469993bb94a73ceb3bac65} + +Get the amount of entries in the list. + +#### Parameters +* `history_compact_list` Handle to a history compact list instance + +#### Returns +Entry count + +#### `public `[`history_compact_t`](#primitives_8h_1afecbcaff5ab6fec4cda05ca77abb093d)` `[`history_compact_list_nth`](#history__compact__list_8h_1ad202250e8072936b89cb9381034c05a7)`(`[`history_compact_list_t`](#primitives_8h_1aa9b635e04d3d0e124549cbef8b147638)` history_list,size_t n)` {#history__compact__list_8h_1ad202250e8072936b89cb9381034c05a7} + +Get the list's n-th entry. + +#### Parameters +* `history_list` Handle to a history compact list instance + +* `n` Index for selecting an entry. Starts at 0 (zero) for the first one + +#### Returns +Handle to a history compact entry. Must be released by calling history_compact_destruct() + +#### `public void `[`input_destruct`](#input_8h_1a07e22ee2679bf79e657229c161e6c669)`(`[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` input)` {#input_8h_1a07e22ee2679bf79e657229c161e6c669} + +Release the memory held by an input instance. + +#### Parameters +* `input` Handle to an input instance + +#### `public int `[`input_is_valid`](#input_8h_1a2403b0b3e70fc82976302dce797feeb8)`(`[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` input)` {#input_8h_1a2403b0b3e70fc82976302dce797feeb8} + +Determine if an input is valid. + +#### Parameters +* `input` Handle to an input instance + +#### Returns +True (non zero) iif the input is valid + +#### `public int `[`input_is_final`](#input_8h_1ad4c90e8e665df2478bbe2861cf16f3ce)`(`[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` input)` {#input_8h_1ad4c90e8e665df2478bbe2861cf16f3ce} + +Determine if an input is final. + +#### Parameters +* `input` Handle to an input instance + +#### Returns +True (non zero) iif the input is final + +#### `public size_t `[`input_serialized_size`](#input_8h_1ac5ce4f197473b950042053bc378311e1)`(`[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` input,int wire)` {#input_8h_1ac5ce4f197473b950042053bc378311e1} + +Get the input's serialized size. + +#### Parameters +* `input` Handle to an input instance + +* `wire` Deprecated; currently ignored + +#### Returns +Input's serialized size + +#### `public uint32_t `[`input_sequence`](#input_8h_1a17ca854ca78275acddea0a46bcf241f9)`(`[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` input)` {#input_8h_1a17ca854ca78275acddea0a46bcf241f9} + +Get the input's sequence number. + +#### Parameters +* `input` Handle to an input instance + +#### Returns +The input's sequence number + +#### `public size_t `[`input_signature_operations`](#input_8h_1a6112eeed9ced97e9b8a65535d259b455)`(`[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` input,int bip16_active)` {#input_8h_1a6112eeed9ced97e9b8a65535d259b455} + +Get the input's signature operations count. + +#### Parameters +* `input` Handle to an input instance + +* `bip16_active` If true (non zero), consider only active operations + +#### Returns +Signature operations count + +#### `public `[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` `[`input_script`](#input_8h_1a5962a64778d3825861968bd7b93f37ca)`(`[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` input)` {#input_8h_1a5962a64778d3825861968bd7b93f37ca} + +Get input script. + +#### Parameters +* `input` Handle to an input instance + +#### Returns +Handle to input script. Must be released by calling [script_destruct()](#script_8h_1a594a6462fb996f38aa6f7b6f54b0c9e0) + +#### `public `[`output_point_t`](#primitives_8h_1ad4d5035e7d5ca4f6a10eafdfdfd2e074)` `[`input_previous_output`](#input_8h_1a6117fe1c39f484f7fef1d76df61cb514)`(`[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` input)` {#input_8h_1a6117fe1c39f484f7fef1d76df61cb514} + +Get the input's previous output. + +#### Parameters +* `input` Handle to an input instance + +#### Returns +Handle to input's previous output. Must be released by calling output_point_destruct + +#### `public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`merkle_block_hash_nth`](#merkle__block_8h_1ae8c9b3a6d6573a51ab7908ae8dd82f78)`(`[`merkle_block_t`](#primitives_8h_1a17bcda76594c1a89acd36ec09d5e41a9)` block,size_t n)` {#merkle__block_8h_1ae8c9b3a6d6573a51ab7908ae8dd82f78} + +Get the block's n-th hash. + +#### Parameters +* `block` Handle to a Merkle block instance + +* `n` Index for selecting hash + +#### Returns +Handle to Merkle block's n-th hash. Must be released by calling delete[] + +#### `public `[`header_t`](#primitives_8h_1ae6323fbfdc3ff99f33acbae250895ab8)` `[`merkle_block_header`](#merkle__block_8h_1ad4ee91f14e5bab50b388c5438ad59698)`(`[`merkle_block_t`](#primitives_8h_1a17bcda76594c1a89acd36ec09d5e41a9)` block)` {#merkle__block_8h_1ad4ee91f14e5bab50b388c5438ad59698} + +Get Merkle block header. + +#### Parameters +* `block` Handle to a Merkle block instance + +#### Returns +Handle to Merkle block header. Must be released by calling [header_destruct()](#header_8h_1a1d1d3fc9341337e1bddd2681fdfed682) + +#### `public int `[`merkle_block_is_valid`](#merkle__block_8h_1ab0176f1b613f53a57476828a302a4178)`(`[`merkle_block_t`](#primitives_8h_1a17bcda76594c1a89acd36ec09d5e41a9)` block)` {#merkle__block_8h_1ab0176f1b613f53a57476828a302a4178} + +Determine if a Merkle block is valid. + +#### Parameters +* `block` Handle to a Merkle block instance + +#### Returns +True (non zero) iif the Merkle block is valid + +#### `public size_t `[`merkle_block_hash_count`](#merkle__block_8h_1acb42d10ee086d6093266b98840da6c6b)`(`[`merkle_block_t`](#primitives_8h_1a17bcda76594c1a89acd36ec09d5e41a9)` block)` {#merkle__block_8h_1acb42d10ee086d6093266b98840da6c6b} + +Get Merkle block hash count. + +#### Parameters +* `block` Handle to a Merkle block instance + +#### Returns +The Merkle block hash count + +#### `public size_t `[`merkle_block_serialized_size`](#merkle__block_8h_1afb2d66d2e76d8e409b736cd7d0383302)`(`[`merkle_block_t`](#primitives_8h_1a17bcda76594c1a89acd36ec09d5e41a9)` block,uint32_t version)` {#merkle__block_8h_1afb2d66d2e76d8e409b736cd7d0383302} + +Get Merkle block serialized size. + +#### Parameters +* `block` Handle to a Merkle block instance + +* `version` Protocol version + +#### Returns +The Merkle block serialized size + +#### `public size_t `[`merkle_block_total_transaction_count`](#merkle__block_8h_1afb0c146c7501223601376a6144c953d6)`(`[`merkle_block_t`](#primitives_8h_1a17bcda76594c1a89acd36ec09d5e41a9)` block)` {#merkle__block_8h_1afb0c146c7501223601376a6144c953d6} + +Get Merkle block transaction count. + +#### Parameters +* `block` Handle to a Merkle block instance + +#### Returns +Merkle block transaction count + +#### `public void `[`merkle_block_destruct`](#merkle__block_8h_1af871439cfb75225e78af8e3454a20ca3)`(`[`merkle_block_t`](#primitives_8h_1a17bcda76594c1a89acd36ec09d5e41a9)` block)` {#merkle__block_8h_1af871439cfb75225e78af8e3454a20ca3} + +Release memory held by Merkle block instance. + +#### Parameters +* `block` Handle to a Merkle block instance + +#### `public void `[`merkle_block_reset`](#merkle__block_8h_1a45c8fca631807d31b893cff090e480e0)`(`[`merkle_block_t`](#primitives_8h_1a17bcda76594c1a89acd36ec09d5e41a9)` block)` {#merkle__block_8h_1a45c8fca631807d31b893cff090e480e0} + +Reset Merkle block. + +#### Parameters +* `block` Handle to a Merkle block instance + +#### `public void `[`output_destruct`](#output_8h_1a974f0d91520ed93250bcd56e2d921590)`(`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` output)` {#output_8h_1a974f0d91520ed93250bcd56e2d921590} + +Release memory held by an output instance. + +#### Parameters +* `output` Handle to an output instance + +#### `public int `[`output_is_valid`](#output_8h_1a0d68a3cfb17807c9a72c5e36a5ee15ce)`(`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` output)` {#output_8h_1a0d68a3cfb17807c9a72c5e36a5ee15ce} + +Determine if an output is valid. + +#### Parameters +* `output` Handle to an output instance + +#### Returns +True (non zero) iif the output is valid + +#### `public size_t `[`output_serialized_size`](#output_8h_1a24adac96e97aa036e0336b309c71fd39)`(`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` output,int wire)` {#output_8h_1a24adac96e97aa036e0336b309c71fd39} + +Get the output's serialized size. + +#### Parameters +* `output` Handle to an output instance + +* `wire` Deprecated; currently ignored + +#### Returns +The output's serialized size + +#### `public uint64_t `[`output_value`](#output_8h_1ab6f944581267dbc41e2fa251f2ff7546)`(`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` output)` {#output_8h_1ab6f944581267dbc41e2fa251f2ff7546} + +Get the output's value. + +#### Parameters +* `output` Handle to an output instance + +#### Returns +The output's value + +#### `public size_t `[`output_signature_operations`](#output_8h_1a4cbbc9de86c223a7f473c18e8a86f305)`(`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` output)` {#output_8h_1a4cbbc9de86c223a7f473c18e8a86f305} + +Get the output signature operations count. + +#### Parameters +* `output` Handle to an output instance + +#### Returns +Amount of signature operations in the output + +#### `public `[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` `[`output_script`](#output_8h_1a8d1f20140cb6d480fbfe0e2622fa5065)`(`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` output)` {#output_8h_1a8d1f20140cb6d480fbfe0e2622fa5065} + +: Get the output's script + +#### Parameters +* `output` Handle to an output instance + +#### Returns +Handle to the output script instance. Must be released by calling script_destruct + +#### `public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`output_get_hash`](#output_8h_1aabd1bd7f280dc40de4e81b3470bb1ab4)`(`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` output)` {#output_8h_1aabd1bd7f280dc40de4e81b3470bb1ab4} + +Get output hash. + +#### Parameters +* `output` Handle to an output instance + +#### Returns +The output hash as a byte array. Must be released by calling delete[] + +#### `public uint32_t `[`output_get_index`](#output_8h_1a0c90a1cb8f51f0a7451a965582a677fb)`(`[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` output)` {#output_8h_1a0c90a1cb8f51f0a7451a965582a677fb} + +Get the output's index. + +#### Parameters +* `output` Handle to an output instance + +#### Returns +Output index + +#### `public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`output_point_get_hash`](#output__point_8h_1ac9f315a515685375a2b015f2afe17eef)`(`[`output_point_t`](#primitives_8h_1ad4d5035e7d5ca4f6a10eafdfdfd2e074)` output)` {#output__point_8h_1ac9f315a515685375a2b015f2afe17eef} + +Get the output point's hash. + +#### Parameters +* `output` Handle to an output point instance + +#### Returns +Point hash as byte array. Must be released by calling delete[] + +#### `public `[`output_point_t`](#primitives_8h_1ad4d5035e7d5ca4f6a10eafdfdfd2e074)` `[`output_point_construct`](#output__point_8h_1aeb7c309b991761bff5cdc4c5cdcbad1e)`()` {#output__point_8h_1aeb7c309b991761bff5cdc4c5cdcbad1e} + +Create an empty output point. + +#### Returns +Handle to new output point instance. Must be released by calling outpout_point_destruct() + +#### `public uint32_t `[`output_point_get_index`](#output__point_8h_1a496394e7491a75771b40d85c400665c2)`(`[`output_point_t`](#primitives_8h_1ad4d5035e7d5ca4f6a10eafdfdfd2e074)` output)` {#output__point_8h_1a496394e7491a75771b40d85c400665c2} + +Get output point index inside the point. Starts at 0 (zero) with the first one. + +#### Parameters +* `output` Handle to an output point instance + +#### Returns +Output point index + +#### `public void `[`output_point_destruct`](#output__point_8h_1a4ae2358a29f31e9a0351585fbf61b993)`(`[`output_point_t`](#primitives_8h_1ad4d5035e7d5ca4f6a10eafdfdfd2e074)` output)` {#output__point_8h_1a4ae2358a29f31e9a0351585fbf61b993} + +Release memory held by output point. + +#### Parameters +* `output` Handle to an output point instance + +#### `public char const * `[`payment_address_encoded`](#payment__address_8h_1a51b00cfb74d43f59cf2ca2e735a2f7f1)`(`[`payment_address_t`](#primitives_8h_1acc9e0ae61a6bf90f01911484e4ede07b)` payment_address)` {#payment__address_8h_1a51b00cfb74d43f59cf2ca2e735a2f7f1} + +Encode a payment address. + +#### Parameters +* `payment_address` Handle to a payment address instance + +#### Returns +Encoded payment address + +#### `public `[`payment_address_t`](#primitives_8h_1acc9e0ae61a6bf90f01911484e4ede07b)` `[`payment_address_construct_from_string`](#payment__address_8h_1a266e2071493b7ed6c7ff9bc9eb80b8fb)`(char const * address)` {#payment__address_8h_1a266e2071493b7ed6c7ff9bc9eb80b8fb} + +Create a payment address from a string. + +#### Parameters +* `address` String representing a payment address + +#### Returns +Handle to encoded payment address. Must be released by calling [payment_address_destruct()](#payment__address_8h_1a4b3dbd5712e7c6569c02763e0dfe4baa) + +#### `public uint8_t `[`version`](#payment__address_8h_1a20d1238557cc4df561e5b09816ea9450)`(`[`payment_address_t`](#primitives_8h_1acc9e0ae61a6bf90f01911484e4ede07b)` payment_address)` {#payment__address_8h_1a20d1238557cc4df561e5b09816ea9450} + +Get payment address version. + +#### Parameters +* `payment_address` Handle to a payment address instance + +#### Returns +Payment address version + +#### `public void `[`payment_address_destruct`](#payment__address_8h_1a4b3dbd5712e7c6569c02763e0dfe4baa)`(`[`payment_address_t`](#primitives_8h_1acc9e0ae61a6bf90f01911484e4ede07b)` payment_address)` {#payment__address_8h_1a4b3dbd5712e7c6569c02763e0dfe4baa} + +Release memory held by payment address instance. + +#### Parameters +* `payment_address` Handle to a payment address instance + +#### `public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`point_get_hash`](#point_8h_1a2a624b2b8a7f329d9962b7a1924e12ab)`(`[`point_t`](#primitives_8h_1af6e7950f472a081d958eb8519843d38b)` point)` {#point_8h_1a2a624b2b8a7f329d9962b7a1924e12ab} + +Get point hash. + +#### Parameters +* `point` Handle to point instance + +#### Returns +Point hash as byte array. Must be released by calling delete[] + +#### `public int `[`point_is_valid`](#point_8h_1aa3224fcebb1829ab9916069c4473859c)`(`[`point_t`](#primitives_8h_1af6e7950f472a081d958eb8519843d38b)` point)` {#point_8h_1aa3224fcebb1829ab9916069c4473859c} + +Determine if point is valid. + +#### Parameters +* `point` Handle to point instance + +#### Returns +True (non zero) iif point is valid + +#### `public uint32_t `[`point_get_index`](#point_8h_1a3fc9f37c57e85b06b0f5b4c6c16ba212)`(`[`point_t`](#primitives_8h_1af6e7950f472a081d958eb8519843d38b)` point)` {#point_8h_1a3fc9f37c57e85b06b0f5b4c6c16ba212} + +Get point index. + +#### Parameters +* `point` Handle to point instance + +#### Returns +Point index + +#### `public uint64_t `[`point_get_checksum`](#point_8h_1a643229ebf5215c2068cee98d0e15fc7c)`(`[`point_t`](#primitives_8h_1af6e7950f472a081d958eb8519843d38b)` point)` {#point_8h_1a643229ebf5215c2068cee98d0e15fc7c} + +Get point checksum. + +#### Parameters +* `point` Handle to point instance + +#### Returns +Point checksum + +#### `public `[`point_t`](#primitives_8h_1af6e7950f472a081d958eb8519843d38b)` `[`point_list_nth`](#point__list_8h_1a81e77050195c59f9d6a618fe8e3f77e1)`(`[`point_list_t`](#primitives_8h_1a58aa9400b0e0aaa34d6b5a1a2666bb29)` point_list,size_t n)` {#point__list_8h_1a81e77050195c59f9d6a618fe8e3f77e1} + +Get the list's n-th point. + +#### Parameters +* `point_list` Handle to a point list instance + +* `n` Index for the selected point. Starts at 0 (zero) with the first one + +#### Returns +Handle to selected point instance. Must be released with point_destruct() + +#### `public size_t `[`point_list_count`](#point__list_8h_1a235ce31f8d2e130a3cbb998f7cf9f459)`(`[`point_list_t`](#primitives_8h_1a58aa9400b0e0aaa34d6b5a1a2666bb29)` point_list)` {#point__list_8h_1a235ce31f8d2e130a3cbb998f7cf9f459} + +Get point list count. + +#### Parameters +* `point_list` Handle to a point list instance + +#### Returns +Point list count + +#### `public void `[`point_list_destruct`](#point__list_8h_1a06f5db8b275deb99ba1c3a31e60e86a2)`(`[`point_list_t`](#primitives_8h_1a58aa9400b0e0aaa34d6b5a1a2666bb29)` point_list)` {#point__list_8h_1a06f5db8b275deb99ba1c3a31e60e86a2} + +Release memory held by point list instance. + +#### Parameters +* `point_list` Handle to a point list instance + +#### `public void `[`script_destruct`](#script_8h_1a594a6462fb996f38aa6f7b6f54b0c9e0)`(`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` script)` {#script_8h_1a594a6462fb996f38aa6f7b6f54b0c9e0} + +Release memory held by a script instance. + +#### Parameters +* `script` Handle to a script instance + +#### `public int `[`script_is_valid`](#script_8h_1ac13f89765de02c5e08a39d8f76c1ad2f)`(`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` script)` {#script_8h_1ac13f89765de02c5e08a39d8f76c1ad2f} + +Determine if a script is valid. + +#### Parameters +* `script` Handle to a script instance + +#### Returns +True (non zero) iif the script is valid + +#### `public int `[`script_is_valid_operations`](#script_8h_1afe1d83cba0d1d005d285882eeacc06a3)`(`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` script)` {#script_8h_1afe1d83cba0d1d005d285882eeacc06a3} + +Determine if the script operations are valid. + +#### Parameters +* `script` Handle to a script instance + +#### Returns +True (non zero) iif the script operations are valid + +#### `public size_t `[`script_satoshi_content_size`](#script_8h_1a022d8a549bdde964bc1c00a77d50f2d0)`(`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` script)` {#script_8h_1a022d8a549bdde964bc1c00a77d50f2d0} + +Get the script Satoshi content size. + +#### Parameters +* `script` Handle to a script instance + +#### Returns +Script Satoshi content size + +#### `public size_t `[`script_serialized_size`](#script_8h_1ac7d8b5cbb37e481721fd5dffd58fbc4d)`(`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` script,bool prefix)` {#script_8h_1ac7d8b5cbb37e481721fd5dffd58fbc4d} + +Get script serialized size. + +#### Parameters +* `script` Handle to a script instance + +* `prefix` If true, add prefix size to total size + +#### Returns +Script serialized size + +#### `public char const * `[`script_to_string`](#script_8h_1a16eafae91b17dc195dee2fc03b9219f4)`(`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` script,uint32_t active_forks)` {#script_8h_1a16eafae91b17dc195dee2fc03b9219f4} + +Get script string representation. + +#### Parameters +* `script` Handle to a script instance + +* `active_forks` Active forks count + +#### Returns +Script string representation + +#### `public size_t `[`script_sigops`](#script_8h_1ab8814aa7853426f6ed6b3de848a27c83)`(`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` script,bool embedded)` {#script_8h_1ab8814aa7853426f6ed6b3de848a27c83} + +Get script signature operations (sigops) count. + +#### Parameters +* `script` Handle to a script instance + +* `embedded` Tells whether to consider embedded sigops in the count or not + +#### Returns +Script sigops count + +#### `public size_t `[`script_embedded_sigops`](#script_8h_1a490c2ea9b3c053eb1048a3a90b8eefea)`(`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` script,`[`script_t`](#primitives_8h_1a14a6f2e8d8ccced8b9bf7844e22e4aef)` prevout_script)` {#script_8h_1a490c2ea9b3c053eb1048a3a90b8eefea} + +Get script embedded signature operations (sigops) count. + +#### Parameters +* `script` Handle to a script instance + +* `prevout_script` Handle to previous script instance + +#### Returns +Embedded signature operations count + +#### `public void `[`transaction_destruct`](#transaction_8h_1ad32fc27899d84318a183ecf152967570)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1ad32fc27899d84318a183ecf152967570} + +Release memory held by transaction instance. + +#### Parameters +* `transaction` Handle to transaction instance + +#### `public int `[`transaction_is_valid`](#transaction_8h_1ad25670d899126e24ab1d156ac967a4df)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1ad25670d899126e24ab1d156ac967a4df} + +Determine if a transaction is valid. + +#### Parameters +* `transaction` Handle to transaction instance + +#### Returns +True (non zero) iif a transaction is valid + +#### `public uint32_t `[`transaction_version`](#transaction_8h_1ac2ab82b5e4ce6a7fbe0b253274849c34)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1ac2ab82b5e4ce6a7fbe0b253274849c34} + +Get transaction version. + +#### Parameters +* `transaction` Handle to transaction instance + +#### Returns +Transaction version + +#### `public void `[`transaction_set_version`](#transaction_8h_1a3a5951371c882dc42d49e1a87ccb7401)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,uint32_t version)` {#transaction_8h_1a3a5951371c882dc42d49e1a87ccb7401} + +Set transaction version. + +#### Parameters +* `transaction` Handle to transaction instance + +* `version` New value for transaction version + +#### `public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`transaction_hash`](#transaction_8h_1a0e6db5b986bbc034483d319f1221b37c)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1a0e6db5b986bbc034483d319f1221b37c} + +Get transaction hash. + +#### Parameters +* `transaction` Handle to transaction instance + +#### Returns +Transaction hash as byte array. Must be released by calling delete[] + +#### `public `[`hash_t`](#primitives_8h_1aa0ccd30c9c9fb169daec5f65600e7c71)` `[`transaction_hash_sighash_type`](#transaction_8h_1a922f312aad666746d25921814a6f1272)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,uint32_t sighash_type)` {#transaction_8h_1a922f312aad666746d25921814a6f1272} + +Get transaction sighash by type. + +#### Parameters +* `transaction` Handle to transaction instance + +* `sighash_type` Sighash type + +#### Returns +Sighash as byte array. Must be released by calling delete[] + +#### `public uint32_t `[`transaction_locktime`](#transaction_8h_1a2c606bb46d54f237d9e19075e8336b4e)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1a2c606bb46d54f237d9e19075e8336b4e} + +Get transaction locktime. + +#### Parameters +* `transaction` Handle to transaction instance + +#### Returns +Transaction locktime + +#### `public size_t `[`transaction_serialized_size`](#transaction_8h_1a742cb6b1ef15066f58ea808292888977)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,int wire)` {#transaction_8h_1a742cb6b1ef15066f58ea808292888977} + +Get transaction serialized size. + +#### Parameters +* `transaction` Handle to transaction instance + +* `wire` Deprecated; currently ignored + +#### Returns +Transaction serialized size + +#### `public uint64_t `[`transaction_fees`](#transaction_8h_1a18e73484e57bb57571c2496f2fb361da)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1a18e73484e57bb57571c2496f2fb361da} + +Get transaction fees. + +#### Parameters +* `transaction` Handle to transaction instance + +#### Returns +Transaction fees + +#### `public size_t `[`transaction_signature_operations`](#transaction_8h_1a2a51456f9e148f42c5dd84e1eca4e119)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1a2a51456f9e148f42c5dd84e1eca4e119} + +Get transaction signature operations count. + +#### Parameters +* `transaction` Handle to transaction instance + +#### Returns +Transaction signature operations count + +#### `public size_t `[`transaction_signature_operations_bip16_active`](#transaction_8h_1a56c17116d7235f6ebec6e25ffdcdbc0b)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,int bip16_active)` {#transaction_8h_1a56c17116d7235f6ebec6e25ffdcdbc0b} + +Get transaction BIP0016 signature operations count. + +#### Parameters +* `transaction` Handle to transaction instance + +* `bip16_active` If true, only consider active operations + +#### Returns +Transaction BIP0016 signature operations count + +#### `public uint64_t `[`transaction_total_input_value`](#transaction_8h_1a72a7d67b3a88aea60275c6a4279e3150)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1a72a7d67b3a88aea60275c6a4279e3150} + +Get the sum of the transaction input values. + +#### Parameters +* `transaction` Handle to transaction instance + +#### Returns +Sum of transaction input values + +#### `public uint64_t `[`transaction_total_output_value`](#transaction_8h_1aa3b36997f594a4967808e166173becae)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1aa3b36997f594a4967808e166173becae} + +Get the sum of the transaction output values. + +#### Parameters +* `transaction` Handle to transaction instance + +#### Returns +Sum of transaction output values + +#### `public int `[`transaction_is_coinbase`](#transaction_8h_1a7a16bc0444fe445d5e690deb5b26783b)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1a7a16bc0444fe445d5e690deb5b26783b} + +Determine if a transaction is coinbase. + +#### Parameters +* `transaction` Handle to transaction instance + +#### Returns +True (non zero) iif transaction is coinbase + +#### `public int `[`transaction_is_null_non_coinbase`](#transaction_8h_1a9133115f7971f603ebe3d579f290a098)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1a9133115f7971f603ebe3d579f290a098} + +Determine if a transaction is null and not coinnase. + +#### Parameters +* `transaction` Handle to transaction instance + +#### Returns +True (non zero) iif the transaction is null and not coinbase + +#### `public int `[`transaction_is_oversized_coinbase`](#transaction_8h_1a202ed448323427c2bd2bf570da7755f6)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1a202ed448323427c2bd2bf570da7755f6} + +Determine if a transaction is oversized coinbase. + +#### Parameters +* `transaction` Handle to transaction instance + +#### Returns +True (non zero) iif the transaction is oversized coinbase + +#### `public int `[`transaction_is_immature`](#transaction_8h_1af59c2b852425cc6defb83564ac93d930)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,size_t target_height)` {#transaction_8h_1af59c2b852425cc6defb83564ac93d930} + +Determine if a transaction is immature. + +#### Parameters +* `transaction` Handle to transaction instance + +* `target_height` Target height + +#### Returns +True (non zero) iif the transaction is immature + +#### `public int `[`transaction_is_overspent`](#transaction_8h_1a9f0a7d2da797716141c12b17ea961409)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1a9f0a7d2da797716141c12b17ea961409} + +Determine if a transaction is overspent. + +#### Parameters +* `transaction` Handle to transaction instance + +#### Returns +True (non zero) iif the transaction is overspent + +#### `public int `[`transaction_is_double_spend`](#transaction_8h_1abeb082da354f1794b20bde7c59fdeecb)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,int include_unconfirmed)` {#transaction_8h_1abeb082da354f1794b20bde7c59fdeecb} + +Determine if a transaction is double spent. + +#### Parameters +* `transaction` Handle to transaction instance + +* `include_unconfirmed` Tells whether to include unconfirmed outputs/inputs + +#### Returns +True (non zero) iif transaction is double spent + +#### `public int `[`transaction_is_missing_previous_outputs`](#transaction_8h_1a6aa8bd4e08e142f6a14a4ab702dc8f69)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1a6aa8bd4e08e142f6a14a4ab702dc8f69} + +Determine whether transaction is missing previous outputs. + +#### Parameters +* `transaction` Handle to transaction instance + +#### Returns +True (non zero) iif transaction is missing previous outputs + +#### `public int `[`transaction_is_final`](#transaction_8h_1a516abef95a61b04e9275caaac85a1632)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,size_t block_height,uint32_t block_time)` {#transaction_8h_1a516abef95a61b04e9275caaac85a1632} + +Determine if a transaction is final. + +#### Parameters +* `transaction` Handle to transaction instance + +* `block_height` Transaction block height + +* `block_time` Transaction block time + +#### Returns +True (non zero) iif the transaction is final + +#### `public int `[`transaction_is_locktime_conflict`](#transaction_8h_1a4e24096bfbadeea91e45715186137e7f)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1a4e24096bfbadeea91e45715186137e7f} + +Determine if a transaction incurs in a locktime conflict. + +#### Parameters +* `transaction` Handle to transaction instance + +#### Returns +True (non zero) iif the transaction incurs in a locktime conflict + +#### `public size_t `[`transaction_output_count`](#transaction_8h_1a44ce3dcf50895f79b005c4ffd2820358)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1a44ce3dcf50895f79b005c4ffd2820358} + +Get transaction output count. + +#### Parameters +* `transaction` Handle to transaction instance + +#### Returns +Transaction output count + +#### `public `[`output_t`](#primitives_8h_1a6db821b2b1332e8be7a662d075ede0b0)` `[`transaction_output_nth`](#transaction_8h_1ab85fba65372d0078afedcc839ed50d46)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,size_t n)` {#transaction_8h_1ab85fba65372d0078afedcc839ed50d46} + +Get the transaction's n-th output. + +#### Parameters +* `transaction` Handle to transaction instance + +* `n` Index to select transaction output. Starts at 0 (zero) for the first one + +#### Returns +Handle to n-th transaction output. Must be released by calling [output_destruct()](#output_8h_1a974f0d91520ed93250bcd56e2d921590) + +#### `public size_t `[`transaction_input_count`](#transaction_8h_1ae6ce6c6592b7a4666592f23050bf51c9)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction)` {#transaction_8h_1ae6ce6c6592b7a4666592f23050bf51c9} + +Get transaction input count. + +#### Parameters +* `transaction` Handle to transaction instance + +#### Returns +Transaction input count + +#### `public `[`input_t`](#primitives_8h_1acb1903f2f2f7ed4502a5f53615cff8aa)` `[`transaction_input_nth`](#transaction_8h_1a58617f586abf033ed1cdaf77e087d538)`(`[`transaction_t`](#primitives_8h_1a5618f23f10ca9f9ad96cf52f4059e995)` transaction,size_t n)` {#transaction_8h_1a58617f586abf033ed1cdaf77e087d538} + +Get n-th transaction input. + +#### Parameters +* `transaction` Handle to transaction instance + +* `n` Index to transaction input. Starts at 0 (zero) for the first one + +#### Returns +Transaction's n-th input + +#### `public `[`word_list_t`](#primitives_8h_1a547ee5b6df76cdddedd5e12dea357036)` `[`word_list_construct`](#word__list_8h_1ac30529cbf0ce5a79d53add1f61c0c90d)`()` {#word__list_8h_1ac30529cbf0ce5a79d53add1f61c0c90d} + +Create a new word list instance. + +#### Returns +Handle to new word list instance. Must be released by calling [word_list_destruct()](#word__list_8h_1a47d1b62e1dc307bac37279d213920436) + +#### `public void `[`word_list_add_word`](#word__list_8h_1af359d913e1eb715be21608dbb90ee558)`(`[`word_list_t`](#primitives_8h_1a547ee5b6df76cdddedd5e12dea357036)` word_list,const char * word)` {#word__list_8h_1af359d913e1eb715be21608dbb90ee558} + +Add a word to the word list +#### Parameters +* `word_list` Handle to a word list instance + +* `word` New word + +#### `public void `[`word_list_destruct`](#word__list_8h_1a47d1b62e1dc307bac37279d213920436)`(`[`word_list_t`](#primitives_8h_1a547ee5b6df76cdddedd5e12dea357036)` word_list)` {#word__list_8h_1a47d1b62e1dc307bac37279d213920436} + +Release memory held by word list object. + +#### Parameters +* `word_list` Handle to a word list instance + +Generated by [Moxygen](https://sourcey.com/moxygen) \ No newline at end of file diff --git a/docs/developer_guide/dotnet/assets/dotnet_interface.png b/docs/developer_guide/dotnet/assets/dotnet_interface.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb2c628fe0938913558237caf24d81d2f251128 GIT binary patch literal 7399 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 literal 0 HcmV?d00001 diff --git a/docs/developer_guide/dotnet/dotnet-Interface.md b/docs/developer_guide/dotnet/dotnet-Interface.md new file mode 100644 index 0000000..bceb5da --- /dev/null +++ b/docs/developer_guide/dotnet/dotnet-Interface.md @@ -0,0 +1,21 @@ +Bitprim's .NET interface is built on top of Bitprim's C interface, in this fashion: + +![](assets/dotnet_interface.png) + +On top of the raw C interface, a 1-1 binding is made in .NET, by using the [Platform Invoke mechanism](https://msdn.microsoft.com/en-us/library/55d3thsc.aspx?f=255&MSPPError=-2147217396), in order to separate access to the API from its usage; this avoids impedance mismatch by separating the marshalling aspects from the binding language idiosyncrasies. That is, the 1-1 interface takes care of marshalling, without changing the interface. Then, the idiomatic interface uses the higher level language tools and idioms in order to hide the complexity from the application programmer. + +It takes another programmer profile in order to tinker with the lower level interfaces or consume them directly, but that is also possible when working with this approach: 3 separate levels of abstraction for accessing the same functionality. + +The platform invoke mechanism was chosen in order to support as many operating systems as possible, because .NET Core does not support C++/CLI. + +## Basic structure + +--- + +See [the source in Github](https://github.com/bitprim/bitprim-cs/tree/master): + +* **idiomatic classes**: Object oriented abstractions over Bitcoin concepts: Chain, Transaction, Block, Header, and so on. The Executor class is responsible for handling node execution. +* **native classes**: These are all static classes, since each of these contains a set of DllImports of the native C functions. + + + diff --git a/docs/developer_guide/dotnet/dotnet-interface-details.md b/docs/developer_guide/dotnet/dotnet-interface-details.md new file mode 100644 index 0000000..9903764 --- /dev/null +++ b/docs/developer_guide/dotnet/dotnet-interface-details.md @@ -0,0 +1,2291 @@ +# Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`namespace `[`Bitprim`](#namespace_bitprim) | +`namespace `[`Bitprim::Logging`](#namespace_bitprim_1_1_logging) | +`namespace `[`Bitprim::Logging::LogProviders`](#namespace_bitprim_1_1_logging_1_1_log_providers) | +`class `[`Bitprim::Logging::LoggerExecutionWrapper::CallSiteExtension`](#class_bitprim_1_1_logging_1_1_logger_execution_wrapper_1_1_call_site_extension) | +`class `[`Constants`](#class_constants) | +`class `[`Bitprim::Logging::LogProviders::Log4NetLogProvider::Log4NetLogger`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log4_net_log_provider_1_1_log4_net_logger) | +`class `[`Bitprim::Logging::LogProviders::LoupeLogProvider::LoupeLogger`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_loupe_log_provider_1_1_loupe_logger) | +`class `[`Bitprim::Logging::LogProviders::NLogLogProvider::NLogLogger`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_n_log_log_provider_1_1_n_log_logger) | +`class `[`Bitprim::Logging::LogProvider::NoOpLogger`](#class_bitprim_1_1_logging_1_1_log_provider_1_1_no_op_logger) | +`class `[`Bitprim::Logging::LogProviders::SerilogLogProvider::SerilogLogger`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_serilog_log_provider_1_1_serilog_logger) | + +# namespace `Bitprim` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`enum `[`CurrencyType`](#namespace_bitprim_1a3f533178085ca25f9713df9565ad8182) | +`enum `[`ErrorCode`](#namespace_bitprim_1a3a9a6bda5cf124c14b0cd5c459566186) | +`enum `[`NetworkType`](#namespace_bitprim_1a22160858220a577b3c9c38dc3c0142cd) | +`class `[`Bitprim::ApiCallResult`](#class_bitprim_1_1_api_call_result) | +`class `[`Bitprim::Binary`](#class_bitprim_1_1_binary) | Represents a binary filter. +`class `[`Bitprim::Block`](#class_bitprim_1_1_block) | Represents a full Bitcoin blockchain block. +`class `[`Bitprim::BlockReader`](#class_bitprim_1_1_block_reader) | Allows user to read a specific set of blocks from the blockchain. +`class `[`Bitprim::Chain`](#class_bitprim_1_1_chain) | Represents the Bitcoin blockchain; meant to offer its different interfaces (query, mining, network) +`class `[`Bitprim::DisposableApiCallResult`](#class_bitprim_1_1_disposable_api_call_result) | +`class `[`Bitprim::Executor`](#class_bitprim_1_1_executor) | Controls the execution of the [Bitprim](#namespace_bitprim) bitcoin node. +`class `[`Bitprim::GetBlockDataResult`](#class_bitprim_1_1_get_block_data_result) | +`class `[`Bitprim::GetBlockHashTimestampResult`](#class_bitprim_1_1_get_block_hash_timestamp_result) | +`class `[`Bitprim::GetBlockHeaderByHashTxSizeResult`](#class_bitprim_1_1_get_block_header_by_hash_tx_size_result) | +`class `[`Bitprim::GetTxDataResult`](#class_bitprim_1_1_get_tx_data_result) | +`class `[`Bitprim::Header`](#class_bitprim_1_1_header) | Represents a full Bitcoin blockchain block. +`class `[`Bitprim::HeaderReader`](#class_bitprim_1_1_header_reader) | Helper for reading the header for each block in a specific set of blocks. +`class `[`Bitprim::HistoryCompact`](#class_bitprim_1_1_history_compact) | [Output](#class_bitprim_1_1_output) points, values, and spends for a payment address. +`class `[`Bitprim::Input`](#class_bitprim_1_1_input) | Represents a [Transaction](#class_bitprim_1_1_transaction) input. +`class `[`Bitprim::MempoolTransaction`](#class_bitprim_1_1_mempool_transaction) | Represents an unconfirmed transaction. +`class `[`Bitprim::MerkleBlock`](#class_bitprim_1_1_merkle_block) | Merkle tree representation of a blockchain block. +`class `[`Bitprim::NativeBuffer`](#class_bitprim_1_1_native_buffer) | RAII wrapper for native memory. Guarantees that even if an exception is thrown, platform_free will be used to release it. Also, it prevents the user from forgetting to call platform_free. +`class `[`Bitprim::NativeString`](#class_bitprim_1_1_native_string) | RAII wrapper for native strings. Guarantees that even if an exception is thrown, platform_free will be used to release the native memory. Also, it prevents the user from forgetting to call platform_free. +`class `[`Bitprim::NodeSettings`](#class_bitprim_1_1_node_settings) | +`class `[`Bitprim::Output`](#class_bitprim_1_1_output) | Represents one of the outputs of a [Transaction](#class_bitprim_1_1_transaction). +`class `[`Bitprim::OutputPoint`](#class_bitprim_1_1_output_point) | [Transaction](#class_bitprim_1_1_transaction) hash and index pair representing one of the transaction outputs. +`class `[`Bitprim::PaymentAddress`](#class_bitprim_1_1_payment_address) | Represents a Bitcoin wallet address. +`class `[`Bitprim::Point`](#class_bitprim_1_1_point) | Represents one of the transaction inputs. It's a transaction hash and index pair. +`class `[`Bitprim::Script`](#class_bitprim_1_1_script) | Represents a transaction script. +`class `[`Bitprim::StealthCompact`](#class_bitprim_1_1_stealth_compact) | Stealth payment related data. +`class `[`Bitprim::TaskHelper`](#class_bitprim_1_1_task_helper) | +`class `[`Bitprim::Transaction`](#class_bitprim_1_1_transaction) | Represents a Bitcoin transaction. +`class `[`Bitprim::Validations`](#class_bitprim_1_1_validations) | +`struct `[`Bitprim::GetTxPositionResult`](#struct_bitprim_1_1_get_tx_position_result) | + +## Members + +#### `enum `[`CurrencyType`](#namespace_bitprim_1a3f533178085ca25f9713df9565ad8182) + + Values | Descriptions +--------------------------------|--------------------------------------------- +None | +Bitcoin | +BitcoinCash | +Litecoin | + +#### `enum `[`ErrorCode`](#namespace_bitprim_1a3a9a6bda5cf124c14b0cd5c459566186) + + Values | Descriptions +--------------------------------|--------------------------------------------- +Success | +Deprecated | +Unknown | +NotFound | +FileSystem | +NonStandard | +NotImplemented | +Oversubscribed | +ServiceStopped | +OperationFailed | +ResolveFailed | +NetworkUnreachable | +AddressInUse | +ListenFailed | +AcceptFailed | +BadStream | +ChannelTimeout | +AddressBlocked | +ChannelStopped | +PeerThrottling | +StoreBlockDuplicate | +StoreBlockInvalidHeight | +StoreBlockMissingParent | +DuplicateBlock | +OrphanBlock | +InvalidPreviousBlock | +InsufficientWork | +OrphanTransaction | +InsufficientFee | +DustyTransaction | +StaleChain | +InvalidProofOfWork | +FuturisticTimestamp | +CheckpointsFailed | +OldVersionBlock | +IncorrectProofOfWork | +TimestampTooEarly | +BlockSizeLimit | +EmptyBlock | +FirstNotCoinbase | +ExtraCoinbases | +InternalDuplicate | +BlockInternalDoubleSpend | +MerkleMismatch | +BlockLegacySigopLimit | +BlockNonFinal | +CoinbaseHeightMismatch | +CoinbaseValueLimit | +BlockEmbeddedSigopLimit | +EmptyTransaction | +PreviousOutputNull | +SpendOverflow | +InvalidCoinbaseScriptSize | +CoinbaseTransaction | +TransactionInternalDoubleSpend | +TransactionSizeLimit | +TransactionLegacySigopLimit | +TransactionNonFinal | +PrematureValidation | +UnspentDuplicate | +MissingPreviousOutput | +DoubleSpend | +CoinbaseMaturity | +SpendExceedsValue | +TransactionEmbeddedSigopLimit | +SequenceLocked | +InvalidScript | +InvalidScriptSize | +InvalidPushDataSize | +InvalidOperationCount | +InvalidStackSize | +InvalidStackScope | +InvalidScriptEmbed | +InvalidSignatureEncoding | +invalidSignatureLaxEncoding | +IncorrectSignature | +StackFalse | +OpDisabled | +OpReserved | +OpPushSize | +OpPushData | +OpIf | +OpNotIf | +OpElse | +OpEndIf | +OpVerify1 | +OpVerify2 | +OpReturn | +OpToAltStack | +OpFromAltStack | +OpDrop2 | +OpDup2 | +OpDup3 | +OpOver2 | +OpRot2 | +OpSwap2 | +OpIfDup | +OpDrop | +OpDup | +OpNip | +OpOver | +OpPick | +OpRoll | +OpRot | +OpSwap | +OpTuck | +OpSize | +OpEqual | +OpEqualVerify1 | +OpEqualVerify2 | +OpAdd1 | +OpSub1 | +OpNegate | +OpAbs | +OpNot | +OpNonZero | +OpAdd | +OpSub | +OpBoolAnd | +OpBoolOr | +OpNumEqual | +OpNumEqualVerify1 | +OpNumEqualVerify2 | +OpNumNotEqual | +OpLessThan | +OpGreaterThan | +OpLessThanOrEqual | +OpGreaterThanOrEqual | +OpMin | +OpMax | +OpWithin | +OpRipemd160 | +OpSha1 | +OpSha256 | +OpHash160 | +OpHash256 | +OpCodeSeperator | +OpCheckSigVerify1 | +OpCheckSig | +OpCheckMultisigVerify1 | +OpCheckMultisigVerify2 | +OpCheckMultisigVerify3 | +OpCheckMultisigVerify4 | +OpCheckMultisigVerify5 | +OpCheckMultisigVerify6 | +OpCheckMultisigVerify7 | +OpCheckMultisig | +OpCheckLocktimeVerify1 | +OpCheckLocktimeVerify2 | +OpCheckLocktimeVerify3 | +OpCheckLocktimeVerify4 | +OpCheckLocktimeVerify5 | +OpCheckLocktimeVerify6 | +OpCheckSequenceVerify1 | +OpCheckSequenceVerify2 | +OpCheckSequenceVerify3 | +OpCheckSequenceVerify4 | +OpCheckSequenceVerify5 | +OpCheckSequenceVerify6 | +OpCheckSequenceVerify7 | + +#### `enum `[`NetworkType`](#namespace_bitprim_1a22160858220a577b3c9c38dc3c0142cd) + + Values | Descriptions +--------------------------------|--------------------------------------------- +None | +Mainnet | +Testnet | +Regtest | + +# class `Bitprim::ApiCallResult` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} ErrorCode `[`ErrorCode`](#class_bitprim_1_1_api_call_result_1a848f2895e2539ab00461ef32f19aaee9) | +`{property} TResultData `[`Result`](#class_bitprim_1_1_api_call_result_1a8796a232b021151d3dd0da31f11c94c8) | + +## Members + +#### `{property} ErrorCode `[`ErrorCode`](#class_bitprim_1_1_api_call_result_1a848f2895e2539ab00461ef32f19aaee9) + +#### `{property} TResultData `[`Result`](#class_bitprim_1_1_api_call_result_1a8796a232b021151d3dd0da31f11c94c8) + +# class `Bitprim::Binary` + +``` +class Bitprim::Binary + : public IDisposable +``` + +Represents a binary filter. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} string `[`Encoded`](#class_bitprim_1_1_binary_1a348a5cb892a0ce13438ff51935a99729) | Filter representation as binary string. +`{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_binary_1a82cf37ab828336a0f9d5069c74cbf473) | +`public inline `[`Binary`](#class_bitprim_1_1_binary_1aacca6d3c790c49a363fbd27641c99556)`()` | Create an empty binary object. +`public inline `[`Binary`](#class_bitprim_1_1_binary_1a6744d5e8c73ec3320c8cfd64b500a290)`(string hexString)` | Creates a binary filter from a binary string. +`public inline `[`Binary`](#class_bitprim_1_1_binary_1aebec751d8756b49f20eb7b1de47ee505)`(UInt64 bitsSize,byte [] blocks,UInt64 n)` | Creates a binary filter from an int array. + +## Members + +#### `{property} string `[`Encoded`](#class_bitprim_1_1_binary_1a348a5cb892a0ce13438ff51935a99729) + +Filter representation as binary string. + +#### `{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_binary_1a82cf37ab828336a0f9d5069c74cbf473) + +#### `public inline `[`Binary`](#class_bitprim_1_1_binary_1aacca6d3c790c49a363fbd27641c99556)`()` + +Create an empty binary object. + +#### `public inline `[`Binary`](#class_bitprim_1_1_binary_1a6744d5e8c73ec3320c8cfd64b500a290)`(string hexString)` + +Creates a binary filter from a binary string. + +#### Parameters +* `hexString` [Binary](#class_bitprim_1_1_binary) string. Example: '10111010101011011111000000001101' + +#### `public inline `[`Binary`](#class_bitprim_1_1_binary_1aebec751d8756b49f20eb7b1de47ee505)`(UInt64 bitsSize,byte [] blocks,UInt64 n)` + +Creates a binary filter from an int array. + +#### Parameters +* `bitsSize` Elements size + +* `blocks` Filter representation. Example: '[186,173,240,13]'. + +* `n` Array length in amount of elements. + +# class `Bitprim::Block` + +``` +class Bitprim::Block + : public IDisposable +``` + +Represents a full Bitcoin blockchain block. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`IsDistinctTransactionSet`](#class_bitprim_1_1_block_1afe00a47b830014c432d79377a1fcf1cc) | Returns true iif all transactions in the block have a unique hash (i.e. no duplicates) +`{property} bool `[`IsExtraCoinbase`](#class_bitprim_1_1_block_1a87a47aa97c8ef31879f1d46fb5825721) | Returns true iif there is more than one coinbase transaction in the block. +`{property} bool `[`IsInternalDoubleSpend`](#class_bitprim_1_1_block_1a02b6dc463e369c4cc989482eb0a82290) | Returns true iif there is at least one double-spent transaction in this block +`{property} bool `[`IsValid`](#class_bitprim_1_1_block_1ab97c0f6e1a70608223c06a5267e65d3a) | Returns true iif the block is valid +`{property} bool `[`IsValidMerkleRoot`](#class_bitprim_1_1_block_1a962a4437dd4b5fdaae6e07248ea12d14) | Returns true iif the generated Merkle root equals the header's Merkle root. +`{property} byte [] `[`Hash`](#class_bitprim_1_1_block_1ad2bfcf76b735aa2c26838d32a03f6d48) | The block's hash as a 32 byte array. +`{property} byte [] `[`MerkleRoot`](#class_bitprim_1_1_block_1a12cd915f751441bc6f9c4c268a4fa349) | The block's Merkle root, as a 32 byte array. +`{property} `[`Header`](#class_bitprim_1_1_header)` `[`Header`](#class_bitprim_1_1_block_1a8e8c733200d3defbd8f71609f54a928d) | The block's header +`{property} string `[`Proof`](#class_bitprim_1_1_block_1a6f2f056f16e77fa4072a22caf3ea8ac1) | +`{property} UInt64 `[`Fees`](#class_bitprim_1_1_block_1a05b35dd6f0f40f631f09846992b8d2ea) | Miner fees included in the block's coinbase transaction. +`{property} UInt64 `[`Claim`](#class_bitprim_1_1_block_1a0d05159ba470f6392f0b21b7f2e7cb25) | Sum of coinbase outputs. +`{property} UInt64 `[`SignatureOperationsCount`](#class_bitprim_1_1_block_1a4731e46255eadfe9aeab1ca9595dfaa1) | Amount of signature operations in the block. +`{property} UInt64 `[`TransactionCount`](#class_bitprim_1_1_block_1a99e6bc147a2c5375cec10bc180793899) | The total amount of transactions that the block contains. +`{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_block_1a9cf18b56ed584c02e3c361ded648712f) | +`public inline bool `[`IsFinal`](#class_bitprim_1_1_block_1a1811740e5097c938813f535aa6563e19)`(UInt64 height)` | Returns true iif every transaction in the block is final or not. +`public inline bool `[`IsValidCoinbaseClaim`](#class_bitprim_1_1_block_1a36bab07eeb6975e123d28d9f6bd2e268)`(UInt64 height)` | Given a block height, return true iif its coinbase claim is not higher than the deserved reward. +`public inline bool `[`IsValidCoinbaseScript`](#class_bitprim_1_1_block_1a700e460e6f249f175c719e874c085561)`(UInt64 height)` | Returns true iif the block's coinbase script is valid. +`public inline byte [] `[`ToData`](#class_bitprim_1_1_block_1a175982ee3e3e8fc96d00af710866838d)`(bool wire)` | Raw block data. +`public inline `[`Transaction`](#class_bitprim_1_1_transaction)` `[`GetNthTransaction`](#class_bitprim_1_1_block_1a4b82ec51f06d880ab179a22e6d27e515)`(UInt64 n)` | Given a position in the block, returns the corresponding transaction. +`public inline UInt64 `[`GetBlockReward`](#class_bitprim_1_1_block_1a65806245a063c53aa11fe46306a97578)`(UInt64 height)` | Reward = Subsidy + Fees, for the block at the given height. +`public inline UInt64 `[`GetSerializedSize`](#class_bitprim_1_1_block_1a0922fac15c8b25e31895bc4e014ae3bc)`(UInt32 version)` | [Block](#class_bitprim_1_1_block) size in bytes. +`public inline UInt64 `[`GetSignatureOperationsCount`](#class_bitprim_1_1_block_1a3b4c90d08441c351b6e4c016a0ad433f)`(bool bip16Active)` | Amount of signature operations in the block. +`public inline UInt64 `[`GetTotalInputs`](#class_bitprim_1_1_block_1a7dcaac2c475eb12f158f23fc1bba6808)`(bool withCoinbase)` | The sum of all inputs of all transactions in the block. + +## Members + +#### `{property} bool `[`IsDistinctTransactionSet`](#class_bitprim_1_1_block_1afe00a47b830014c432d79377a1fcf1cc) + +Returns true iif all transactions in the block have a unique hash (i.e. no duplicates) + +#### `{property} bool `[`IsExtraCoinbase`](#class_bitprim_1_1_block_1a87a47aa97c8ef31879f1d46fb5825721) + +Returns true iif there is more than one coinbase transaction in the block. + +#### `{property} bool `[`IsInternalDoubleSpend`](#class_bitprim_1_1_block_1a02b6dc463e369c4cc989482eb0a82290) + +Returns true iif there is at least one double-spent transaction in this block + +#### `{property} bool `[`IsValid`](#class_bitprim_1_1_block_1ab97c0f6e1a70608223c06a5267e65d3a) + +Returns true iif the block is valid + +#### `{property} bool `[`IsValidMerkleRoot`](#class_bitprim_1_1_block_1a962a4437dd4b5fdaae6e07248ea12d14) + +Returns true iif the generated Merkle root equals the header's Merkle root. + +#### `{property} byte [] `[`Hash`](#class_bitprim_1_1_block_1ad2bfcf76b735aa2c26838d32a03f6d48) + +The block's hash as a 32 byte array. + +#### `{property} byte [] `[`MerkleRoot`](#class_bitprim_1_1_block_1a12cd915f751441bc6f9c4c268a4fa349) + +The block's Merkle root, as a 32 byte array. + +#### `{property} `[`Header`](#class_bitprim_1_1_header)` `[`Header`](#class_bitprim_1_1_block_1a8e8c733200d3defbd8f71609f54a928d) + +The block's header + +#### `{property} string `[`Proof`](#class_bitprim_1_1_block_1a6f2f056f16e77fa4072a22caf3ea8ac1) + +#### `{property} UInt64 `[`Fees`](#class_bitprim_1_1_block_1a05b35dd6f0f40f631f09846992b8d2ea) + +Miner fees included in the block's coinbase transaction. + +#### `{property} UInt64 `[`Claim`](#class_bitprim_1_1_block_1a0d05159ba470f6392f0b21b7f2e7cb25) + +Sum of coinbase outputs. + +#### `{property} UInt64 `[`SignatureOperationsCount`](#class_bitprim_1_1_block_1a4731e46255eadfe9aeab1ca9595dfaa1) + +Amount of signature operations in the block. + +#### `{property} UInt64 `[`TransactionCount`](#class_bitprim_1_1_block_1a99e6bc147a2c5375cec10bc180793899) + +The total amount of transactions that the block contains. + +#### `{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_block_1a9cf18b56ed584c02e3c361ded648712f) + +#### `public inline bool `[`IsFinal`](#class_bitprim_1_1_block_1a1811740e5097c938813f535aa6563e19)`(UInt64 height)` + +Returns true iif every transaction in the block is final or not. + +#### Parameters +* `height` + +#### Returns + +#### `public inline bool `[`IsValidCoinbaseClaim`](#class_bitprim_1_1_block_1a36bab07eeb6975e123d28d9f6bd2e268)`(UInt64 height)` + +Given a block height, return true iif its coinbase claim is not higher than the deserved reward. + +#### Parameters +* `height` The height which identifies the block to examine + +#### Returns +True iif 1 if coinbase claim is not higher than the deserved reward. + +#### `public inline bool `[`IsValidCoinbaseScript`](#class_bitprim_1_1_block_1a700e460e6f249f175c719e874c085561)`(UInt64 height)` + +Returns true iif the block's coinbase script is valid. + +#### Parameters +* `height` The block's height. Identifies it univocally. + +#### Returns +True iif the block's coinbase script is valid. + +#### `public inline byte [] `[`ToData`](#class_bitprim_1_1_block_1a175982ee3e3e8fc96d00af710866838d)`(bool wire)` + +Raw block data. + +#### Parameters +* `wire` Iif true, include data size at the beginning. + +#### Returns +Byte array with block data. + +#### `public inline `[`Transaction`](#class_bitprim_1_1_transaction)` `[`GetNthTransaction`](#class_bitprim_1_1_block_1a4b82ec51f06d880ab179a22e6d27e515)`(UInt64 n)` + +Given a position in the block, returns the corresponding transaction. + +#### Parameters +* `n` Zero-based index + +#### Returns +Full transaction object + +#### `public inline UInt64 `[`GetBlockReward`](#class_bitprim_1_1_block_1a65806245a063c53aa11fe46306a97578)`(UInt64 height)` + +Reward = Subsidy + Fees, for the block at the given height. + +#### Parameters +* `height` [Block](#class_bitprim_1_1_block) height in the chain; identifies it univocally. + +#### Returns +UInt64 representation of the block's reward. + +#### `public inline UInt64 `[`GetSerializedSize`](#class_bitprim_1_1_block_1a0922fac15c8b25e31895bc4e014ae3bc)`(UInt32 version)` + +[Block](#class_bitprim_1_1_block) size in bytes. + +#### Parameters +* `version` Protocol version. + +#### Returns +UInt64 representation of the block size in bytes. + +#### `public inline UInt64 `[`GetSignatureOperationsCount`](#class_bitprim_1_1_block_1a3b4c90d08441c351b6e4c016a0ad433f)`(bool bip16Active)` + +Amount of signature operations in the block. + +#### Parameters +* `bip16Active` Iif true, count bip16 active operations. + +#### Returns +The amount of signature operations in this block + +#### `public inline UInt64 `[`GetTotalInputs`](#class_bitprim_1_1_block_1a7dcaac2c475eb12f158f23fc1bba6808)`(bool withCoinbase)` + +The sum of all inputs of all transactions in the block. + +#### Parameters +* `withCoinbase` Iif true, consider coinbase transactions. + +#### Returns +UInt64 representation of the sum + +# class `Bitprim::BlockReader` + +``` +class Bitprim::BlockReader + : public IDisposable +``` + +Allows user to read a specific set of blocks from the blockchain. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`IsValid`](#class_bitprim_1_1_block_reader_1abc3a66acbadba275e8c53c9bb95414d0) | Return true iif all blocks in the specified set are valid +`{property} byte [] `[`StopHash`](#class_bitprim_1_1_block_reader_1a645f071f77d3bec92772d8d0fbf6728f) | Get or set on which block to stop reading. +`{property} HashList `[`StartHashes`](#class_bitprim_1_1_block_reader_1ae8994bb2e2da8bbd60646ecba426d3da) | Get or set the hashes that have to be read in order to start reading. +`public inline `[`BlockReader`](#class_bitprim_1_1_block_reader_1a2f3517010212c08923713744102191f8)`()` | +`public inline `[`BlockReader`](#class_bitprim_1_1_block_reader_1afe8436a6e4f16343654fcfea4709120c)`(HashList start,byte [] stop)` | +`public inline UInt64 `[`GetSerializedSize`](#class_bitprim_1_1_block_reader_1a610a7c455b51380ac5afc0ac623cd843)`(UInt32 version)` | The sum of the sizes of the read blocks. +`public inline void `[`Reset`](#class_bitprim_1_1_block_reader_1afb00b31f123c231a970b4cdf16e20d08)`()` | Go back to the beginning of the block set. + +## Members + +#### `{property} bool `[`IsValid`](#class_bitprim_1_1_block_reader_1abc3a66acbadba275e8c53c9bb95414d0) + +Return true iif all blocks in the specified set are valid + +#### `{property} byte [] `[`StopHash`](#class_bitprim_1_1_block_reader_1a645f071f77d3bec92772d8d0fbf6728f) + +Get or set on which block to stop reading. + +#### `{property} HashList `[`StartHashes`](#class_bitprim_1_1_block_reader_1ae8994bb2e2da8bbd60646ecba426d3da) + +Get or set the hashes that have to be read in order to start reading. + +#### `public inline `[`BlockReader`](#class_bitprim_1_1_block_reader_1a2f3517010212c08923713744102191f8)`()` + +#### `public inline `[`BlockReader`](#class_bitprim_1_1_block_reader_1afe8436a6e4f16343654fcfea4709120c)`(HashList start,byte [] stop)` + +#### `public inline UInt64 `[`GetSerializedSize`](#class_bitprim_1_1_block_reader_1a610a7c455b51380ac5afc0ac623cd843)`(UInt32 version)` + +The sum of the sizes of the read blocks. + +#### Parameters +* `version` Protocol version to consider when calculating block size. + +#### Returns +UInt64 representation of the sum + +#### `public inline void `[`Reset`](#class_bitprim_1_1_block_reader_1afb00b31f123c231a970b4cdf16e20d08)`()` + +Go back to the beginning of the block set. + +# class `Bitprim::Chain` + +Represents the Bitcoin blockchain; meant to offer its different interfaces (query, mining, network) + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_chain_1a6ba45403dfc6b61b59c8849a9bf565f3) | +`{property} bool `[`IsStale`](#class_bitprim_1_1_chain_1a8b8851b7dd1cb47efdec3817277faaad) | Determine if the node is synchronized (i.e. has the latest copy of the blockchain/is at top height) +`public inline async Task< `[`ApiCallResult`](#class_bitprim_1_1_api_call_result)`< UInt64 > > `[`FetchBlockHeightAsync`](#class_bitprim_1_1_chain_1a05e73bd15a88afc5005319018e6dda39)`(byte [] blockHash)` | Given a block hash, it queries the chain asynchronously for the block's height. Return right away and uses a callback to return the result. +`public inline async Task< `[`ApiCallResult`](#class_bitprim_1_1_api_call_result)`< UInt64 > > `[`FetchLastHeightAsync`](#class_bitprim_1_1_chain_1aa99d17cc65a7b313b93513d92634bbd9)`()` | Gets the height of the highest block in the local copy of the blockchain, asynchronously. +`public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockDataResult](#class_bitprim_1_1_get_block_data_result)< [Block`](#class_bitprim_1_1_block)` > > > `[`FetchBlockByHashAsync`](#class_bitprim_1_1_chain_1a4c912cb5da30ad7373f5869f37b66bbc)`(byte [] blockHash)` | Given a block hash, retrieve the full block it identifies, asynchronously. +`public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockDataResult](#class_bitprim_1_1_get_block_data_result)< [Block`](#class_bitprim_1_1_block)` > > > `[`FetchBlockByHeightAsync`](#class_bitprim_1_1_chain_1a07cf0ef0db61d176403b7107aad8cca0)`(UInt64 height)` | Given a block height, retrieve the full block it identifies, asynchronously. +`public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockHeaderByHashTxSizeResult`](#class_bitprim_1_1_get_block_header_by_hash_tx_size_result)` > > `[`FetchBlockHeaderByHashTxSizesAsync`](#class_bitprim_1_1_chain_1a16fbf9347d382e413596738050e477cc)`(byte [] blockHash)` | Given a block hash, retrieve block header, tx hashes and serialized block size, asynchronously. +`public inline async Task< `[`ApiCallResult](#class_bitprim_1_1_api_call_result)< [GetBlockHashTimestampResult`](#class_bitprim_1_1_get_block_hash_timestamp_result)` > > `[`FetchBlockByHeightHashTimestampAsync`](#class_bitprim_1_1_chain_1a0ed827e80a50f6ef1537f4e3323161ec)`(UInt64 height)` | Given a block height, retrieve only block hash and timestamp, asynchronously. +`public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockDataResult](#class_bitprim_1_1_get_block_data_result)< [Header`](#class_bitprim_1_1_header)` > > > `[`FetchBlockHeaderByHashAsync`](#class_bitprim_1_1_chain_1a481afe875fea3bed18fdcc5f34881d24)`(byte [] blockHash)` | Given a block hash, get the header from the block it identifies, asynchronously. +`public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockDataResult](#class_bitprim_1_1_get_block_data_result)< [Header`](#class_bitprim_1_1_header)` > > > `[`FetchBlockHeaderByHeightAsync`](#class_bitprim_1_1_chain_1af8dde319dada6e5fc337110280e7ecdf)`(UInt64 height)` | Given a block height, get the header from the block it identifies, asynchronously. +`public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockDataResult](#class_bitprim_1_1_get_block_data_result)< [MerkleBlock`](#class_bitprim_1_1_merkle_block)` > > > `[`FetchMerkleBlockByHashAsync`](#class_bitprim_1_1_chain_1a3065a220899aa4e7499e00c82a986800)`(byte [] blockHash)` | Given a block hash, get the merkle block from the block it identifies, asynchronously. +`public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockDataResult](#class_bitprim_1_1_get_block_data_result)< [MerkleBlock`](#class_bitprim_1_1_merkle_block)` > > > `[`FetchMerkleBlockByHeightAsync`](#class_bitprim_1_1_chain_1a51960cb40096565cba29801ecef869ce)`(UInt64 height)` | Given a block height, get the merkle block from the block it identifies, asynchronously. +`public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockDataResult`](#class_bitprim_1_1_get_block_data_result)`< CompactBlock > > > `[`FetchCompactBlockByHash`](#class_bitprim_1_1_chain_1a7d2a96a34f4db98b4bb95f0945c8eb91)`(byte [] blockHash)` | Given a block hash, get the compact block from the block it identifies, asynchronously. +`public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockDataResult`](#class_bitprim_1_1_get_block_data_result)`< CompactBlock > > > `[`FetchCompactBlockByHeightAsync`](#class_bitprim_1_1_chain_1ab44be34165be4cd968eecd0b8aa0daba)`(UInt64 height)` | Given a block height, get the compact block from the block it identifies, asynchronously. +`public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetTxDataResult`](#class_bitprim_1_1_get_tx_data_result)` > > `[`FetchTransactionAsync`](#class_bitprim_1_1_chain_1acd7a013b2d7dfb59a2be96c7e0fbe4ce)`(byte [] txHash,bool requireConfirmed)` | Get a transaction by its hash, asynchronously. +`public inline async Task< `[`ApiCallResult](#class_bitprim_1_1_api_call_result)< [GetTxPositionResult`](#struct_bitprim_1_1_get_tx_position_result)` > > `[`FetchTransactionPositionAsync`](#class_bitprim_1_1_chain_1a5dc1c0c121540d6f3fcdac769e5dfcbb)`(byte [] txHash,bool requireConfirmed)` | Given a transaction hash, it fetches the height and position inside the block, asynchronously. +`public inline async Task< `[`ApiCallResult](#class_bitprim_1_1_api_call_result)< [Point`](#class_bitprim_1_1_point)` > > `[`FetchSpendAsync`](#class_bitprim_1_1_chain_1aa6f96700ac465dfb8899f8199c65a372)`(`[`OutputPoint`](#class_bitprim_1_1_output_point)` outputPoint)` | Fetch the transaction input which spends the indicated output, asynchronously. +`public inline async Task< `[`DisposableApiCallResult`](#class_bitprim_1_1_disposable_api_call_result)`< HistoryCompactList > > `[`FetchHistoryAsync`](#class_bitprim_1_1_chain_1ab8077112761466c2e19eca51d3e5eadf)`(`[`PaymentAddress`](#class_bitprim_1_1_payment_address)` address,UInt64 limit,UInt64 fromHeight)` | Get a list of output points, values, and spends for a given payment address (asynchronously) +`public inline async Task< `[`DisposableApiCallResult`](#class_bitprim_1_1_disposable_api_call_result)`< HashList > > `[`FetchConfirmedTransactionsAsync`](#class_bitprim_1_1_chain_1affd9881e0c675e1e3202b33c697043e8)`(`[`PaymentAddress`](#class_bitprim_1_1_payment_address)` address,UInt64 limit,UInt64 fromHeight)` | Get a list of tx ids for a given payment address (asynchronously). Duplicates are already filtered out. +`public inline async Task< `[`DisposableApiCallResult`](#class_bitprim_1_1_disposable_api_call_result)`< StealthCompactList > > `[`FetchStealthAsync`](#class_bitprim_1_1_chain_1a9a39b99193848b3c051b8b4eb985e692)`(`[`Binary`](#class_bitprim_1_1_binary)` filter,UInt64 fromHeight)` | Get metadata on potential payment transactions by stealth filter. Given a filter and a height in the chain, it queries the chain for transactions matching the given filter. +`public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [HeaderReader`](#class_bitprim_1_1_header_reader)` > > `[`FetchBlockLocatorAsync`](#class_bitprim_1_1_chain_1ab76ad8f4fecec65e9934c38288f23f56)`(BlockIndexList indexes)` | Given a list of indexes, fetch a header reader for them, asynchronously +`public inline async Task< ErrorCode > `[`OrganizeBlockAsync`](#class_bitprim_1_1_chain_1ac98d25baa15b37a77a48becca57c4968)`(`[`Block`](#class_bitprim_1_1_block)` block)` | Given a block, organize it (async). +`public inline async Task< ErrorCode > `[`OrganizeTransactionAsync`](#class_bitprim_1_1_chain_1a23be64a1bbec23574fd616edede37111)`(`[`Transaction`](#class_bitprim_1_1_transaction)` transaction)` | Given a transaction, organize it (async). +`public inline async Task< `[`ApiCallResult`](#class_bitprim_1_1_api_call_result)`< string > > `[`ValidateTransactionAsync`](#class_bitprim_1_1_chain_1a233758a5d970628d399287a851795670)`(`[`Transaction`](#class_bitprim_1_1_transaction)` transaction)` | Determine if a transaction is valid for submission to the blockchain. +`public inline MempoolTransactionList `[`GetMempoolTransactions`](#class_bitprim_1_1_chain_1a44a0cd66999dde4914e1e013c582d731)`(`[`PaymentAddress`](#class_bitprim_1_1_payment_address)` address,bool useTestnetRules)` | + +## Members + +#### `{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_chain_1a6ba45403dfc6b61b59c8849a9bf565f3) + +#### `{property} bool `[`IsStale`](#class_bitprim_1_1_chain_1a8b8851b7dd1cb47efdec3817277faaad) + +Determine if the node is synchronized (i.e. has the latest copy of the blockchain/is at top height) + +#### `public inline async Task< `[`ApiCallResult`](#class_bitprim_1_1_api_call_result)`< UInt64 > > `[`FetchBlockHeightAsync`](#class_bitprim_1_1_chain_1a05e73bd15a88afc5005319018e6dda39)`(byte [] blockHash)` + +Given a block hash, it queries the chain asynchronously for the block's height. Return right away and uses a callback to return the result. + +#### Parameters +* `blockHash` 32-byte array representation of the block hash. Identifies it univocally. + +#### `public inline async Task< `[`ApiCallResult`](#class_bitprim_1_1_api_call_result)`< UInt64 > > `[`FetchLastHeightAsync`](#class_bitprim_1_1_chain_1aa99d17cc65a7b313b93513d92634bbd9)`()` + +Gets the height of the highest block in the local copy of the blockchain, asynchronously. + +#### `public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockDataResult](#class_bitprim_1_1_get_block_data_result)< [Block`](#class_bitprim_1_1_block)` > > > `[`FetchBlockByHashAsync`](#class_bitprim_1_1_chain_1a4c912cb5da30ad7373f5869f37b66bbc)`(byte [] blockHash)` + +Given a block hash, retrieve the full block it identifies, asynchronously. + +#### Parameters +* `blockHash` 32 bytes of the block hash + +#### `public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockDataResult](#class_bitprim_1_1_get_block_data_result)< [Block`](#class_bitprim_1_1_block)` > > > `[`FetchBlockByHeightAsync`](#class_bitprim_1_1_chain_1a07cf0ef0db61d176403b7107aad8cca0)`(UInt64 height)` + +Given a block height, retrieve the full block it identifies, asynchronously. + +#### Parameters +* `height` [Block](#class_bitprim_1_1_block) height + +#### `public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockHeaderByHashTxSizeResult`](#class_bitprim_1_1_get_block_header_by_hash_tx_size_result)` > > `[`FetchBlockHeaderByHashTxSizesAsync`](#class_bitprim_1_1_chain_1a16fbf9347d382e413596738050e477cc)`(byte [] blockHash)` + +Given a block hash, retrieve block header, tx hashes and serialized block size, asynchronously. + +#### Parameters +* `blockHash` 32 bytes of the block hash + +#### `public inline async Task< `[`ApiCallResult](#class_bitprim_1_1_api_call_result)< [GetBlockHashTimestampResult`](#class_bitprim_1_1_get_block_hash_timestamp_result)` > > `[`FetchBlockByHeightHashTimestampAsync`](#class_bitprim_1_1_chain_1a0ed827e80a50f6ef1537f4e3323161ec)`(UInt64 height)` + +Given a block height, retrieve only block hash and timestamp, asynchronously. + +#### Parameters +* `height` [Block](#class_bitprim_1_1_block) height + +#### `public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockDataResult](#class_bitprim_1_1_get_block_data_result)< [Header`](#class_bitprim_1_1_header)` > > > `[`FetchBlockHeaderByHashAsync`](#class_bitprim_1_1_chain_1a481afe875fea3bed18fdcc5f34881d24)`(byte [] blockHash)` + +Given a block hash, get the header from the block it identifies, asynchronously. + +#### Parameters +* `blockHash` 32 bytes of the block hash + +#### `public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockDataResult](#class_bitprim_1_1_get_block_data_result)< [Header`](#class_bitprim_1_1_header)` > > > `[`FetchBlockHeaderByHeightAsync`](#class_bitprim_1_1_chain_1af8dde319dada6e5fc337110280e7ecdf)`(UInt64 height)` + +Given a block height, get the header from the block it identifies, asynchronously. + +#### Parameters +* `height` [Block](#class_bitprim_1_1_block) height + +#### `public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockDataResult](#class_bitprim_1_1_get_block_data_result)< [MerkleBlock`](#class_bitprim_1_1_merkle_block)` > > > `[`FetchMerkleBlockByHashAsync`](#class_bitprim_1_1_chain_1a3065a220899aa4e7499e00c82a986800)`(byte [] blockHash)` + +Given a block hash, get the merkle block from the block it identifies, asynchronously. + +#### Parameters +* `blockHash` 32 bytes of the block hash + +#### `public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockDataResult](#class_bitprim_1_1_get_block_data_result)< [MerkleBlock`](#class_bitprim_1_1_merkle_block)` > > > `[`FetchMerkleBlockByHeightAsync`](#class_bitprim_1_1_chain_1a51960cb40096565cba29801ecef869ce)`(UInt64 height)` + +Given a block height, get the merkle block from the block it identifies, asynchronously. + +#### Parameters +* `height` Desired block height + +#### `public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockDataResult`](#class_bitprim_1_1_get_block_data_result)`< CompactBlock > > > `[`FetchCompactBlockByHash`](#class_bitprim_1_1_chain_1a7d2a96a34f4db98b4bb95f0945c8eb91)`(byte [] blockHash)` + +Given a block hash, get the compact block from the block it identifies, asynchronously. + +#### Parameters +* `blockHash` 32 bytes of the block hash + +#### `public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetBlockDataResult`](#class_bitprim_1_1_get_block_data_result)`< CompactBlock > > > `[`FetchCompactBlockByHeightAsync`](#class_bitprim_1_1_chain_1ab44be34165be4cd968eecd0b8aa0daba)`(UInt64 height)` + +Given a block height, get the compact block from the block it identifies, asynchronously. + +#### Parameters +* `height` Desired block height + +#### `public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [GetTxDataResult`](#class_bitprim_1_1_get_tx_data_result)` > > `[`FetchTransactionAsync`](#class_bitprim_1_1_chain_1acd7a013b2d7dfb59a2be96c7e0fbe4ce)`(byte [] txHash,bool requireConfirmed)` + +Get a transaction by its hash, asynchronously. + +#### Parameters +* `txHash` 32 bytes of transaction hash + +* `requireConfirmed` True if the transaction must belong to a block + +#### `public inline async Task< `[`ApiCallResult](#class_bitprim_1_1_api_call_result)< [GetTxPositionResult`](#struct_bitprim_1_1_get_tx_position_result)` > > `[`FetchTransactionPositionAsync`](#class_bitprim_1_1_chain_1a5dc1c0c121540d6f3fcdac769e5dfcbb)`(byte [] txHash,bool requireConfirmed)` + +Given a transaction hash, it fetches the height and position inside the block, asynchronously. + +#### Parameters +* `txHash` 32 bytes of transaction hash + +* `requireConfirmed` True iif the transaction must belong to a block + +#### `public inline async Task< `[`ApiCallResult](#class_bitprim_1_1_api_call_result)< [Point`](#class_bitprim_1_1_point)` > > `[`FetchSpendAsync`](#class_bitprim_1_1_chain_1aa6f96700ac465dfb8899f8199c65a372)`(`[`OutputPoint`](#class_bitprim_1_1_output_point)` outputPoint)` + +Fetch the transaction input which spends the indicated output, asynchronously. + +#### Parameters +* `outputPoint` Tx hash and index pair where the output was spent. + +#### `public inline async Task< `[`DisposableApiCallResult`](#class_bitprim_1_1_disposable_api_call_result)`< HistoryCompactList > > `[`FetchHistoryAsync`](#class_bitprim_1_1_chain_1ab8077112761466c2e19eca51d3e5eadf)`(`[`PaymentAddress`](#class_bitprim_1_1_payment_address)` address,UInt64 limit,UInt64 fromHeight)` + +Get a list of output points, values, and spends for a given payment address (asynchronously) + +#### Parameters +* `address` Bitcoin payment address to search + +* `limit` Maximum amount of results to fetch + +* `fromHeight` Starting point to search for transactions + +#### `public inline async Task< `[`DisposableApiCallResult`](#class_bitprim_1_1_disposable_api_call_result)`< HashList > > `[`FetchConfirmedTransactionsAsync`](#class_bitprim_1_1_chain_1affd9881e0c675e1e3202b33c697043e8)`(`[`PaymentAddress`](#class_bitprim_1_1_payment_address)` address,UInt64 limit,UInt64 fromHeight)` + +Get a list of tx ids for a given payment address (asynchronously). Duplicates are already filtered out. + +#### Parameters +* `address` Bitcoin payment address to search + +* `limit` Maximum amount of results to fetch + +* `fromHeight` Starting point to search for transactions + +#### `public inline async Task< `[`DisposableApiCallResult`](#class_bitprim_1_1_disposable_api_call_result)`< StealthCompactList > > `[`FetchStealthAsync`](#class_bitprim_1_1_chain_1a9a39b99193848b3c051b8b4eb985e692)`(`[`Binary`](#class_bitprim_1_1_binary)` filter,UInt64 fromHeight)` + +Get metadata on potential payment transactions by stealth filter. Given a filter and a height in the chain, it queries the chain for transactions matching the given filter. + +#### Parameters +* `filter` Must be at least 8 bits in length. example "10101010" + +* `fromHeight` Starting height in the chain to search for transactions + +#### `public inline async Task< `[`DisposableApiCallResult](#class_bitprim_1_1_disposable_api_call_result)< [HeaderReader`](#class_bitprim_1_1_header_reader)` > > `[`FetchBlockLocatorAsync`](#class_bitprim_1_1_chain_1ab76ad8f4fecec65e9934c38288f23f56)`(BlockIndexList indexes)` + +Given a list of indexes, fetch a header reader for them, asynchronously + +#### Parameters +* `indexes` [Block](#class_bitprim_1_1_block) indexes + +#### `public inline async Task< ErrorCode > `[`OrganizeBlockAsync`](#class_bitprim_1_1_chain_1ac98d25baa15b37a77a48becca57c4968)`(`[`Block`](#class_bitprim_1_1_block)` block)` + +Given a block, organize it (async). + +#### Parameters +* `block` The block to organize + +#### `public inline async Task< ErrorCode > `[`OrganizeTransactionAsync`](#class_bitprim_1_1_chain_1a23be64a1bbec23574fd616edede37111)`(`[`Transaction`](#class_bitprim_1_1_transaction)` transaction)` + +Given a transaction, organize it (async). + +#### Parameters +* `transaction` The transaction to organize. + +#### `public inline async Task< `[`ApiCallResult`](#class_bitprim_1_1_api_call_result)`< string > > `[`ValidateTransactionAsync`](#class_bitprim_1_1_chain_1a233758a5d970628d399287a851795670)`(`[`Transaction`](#class_bitprim_1_1_transaction)` transaction)` + +Determine if a transaction is valid for submission to the blockchain. + +#### Parameters +* `transaction` [Transaction](#class_bitprim_1_1_transaction) to validate + +#### `public inline MempoolTransactionList `[`GetMempoolTransactions`](#class_bitprim_1_1_chain_1a44a0cd66999dde4914e1e013c582d731)`(`[`PaymentAddress`](#class_bitprim_1_1_payment_address)` address,bool useTestnetRules)` + +# class `Bitprim::DisposableApiCallResult` + +``` +class Bitprim::DisposableApiCallResult + : public IDisposable +``` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} ErrorCode `[`ErrorCode`](#class_bitprim_1_1_disposable_api_call_result_1abd6d0781149b4db77a1ef5ac3c2e167c) | +`{property} TResultData `[`Result`](#class_bitprim_1_1_disposable_api_call_result_1ab1b9fdc66ec7701386eb7c81118a6dac) | + +## Members + +#### `{property} ErrorCode `[`ErrorCode`](#class_bitprim_1_1_disposable_api_call_result_1abd6d0781149b4db77a1ef5ac3c2e167c) + +#### `{property} TResultData `[`Result`](#class_bitprim_1_1_disposable_api_call_result_1ab1b9fdc66ec7701386eb7c81118a6dac) + +# class `Bitprim::Executor` + +``` +class Bitprim::Executor + : public IDisposable +``` + +Controls the execution of the [Bitprim](#namespace_bitprim) bitcoin node. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`UseTestnetRules`](#class_bitprim_1_1_executor_1a72721235e276a2022424254285a89859) | Returns true iif the current network is a testnet. +`{property} `[`Chain`](#class_bitprim_1_1_chain)` `[`Chain`](#class_bitprim_1_1_executor_1ac610ccf2aeb37d042c6de111dc4af3d8) | The node's query interface. Will be null until node starts running (i.e. Run or RunWait succeeded) +`{property} NetworkType `[`NetworkType`](#class_bitprim_1_1_executor_1aaa0cd4c024e384cd8d0f99daebada6cd) | The node's network. Won't be valid until node starts running (i.e. Run or RunWait succeeded) +`{property} bool `[`IsStopped`](#class_bitprim_1_1_executor_1aa3d8e0c57065dc536ae997cf3d46340f) | +`{property} bool `[`IsLoadConfigValid`](#class_bitprim_1_1_executor_1af8b481e884520c67c9d348c32f6adcbb) | +`public delegate bool `[`BlockHandler`](#class_bitprim_1_1_executor_1aa8f3a08638a1c8a977c780be93c5cdf9)`(ErrorCode e,UInt64 u,BlockList incoming,BlockList outgoing)` | +`public delegate bool `[`TransactionHandler`](#class_bitprim_1_1_executor_1af552875e00ecb97f9529b6892d5fa9ed)`(ErrorCode e,`[`Transaction`](#class_bitprim_1_1_transaction)` newTx)` | +`public inline `[`Executor`](#class_bitprim_1_1_executor_1ac689798a0303fa5e0b289b9601ff4a41)`(string configFile)` | Create executor. Does not init database or start execution yet. +`public inline `[`Executor`](#class_bitprim_1_1_executor_1a4a0a051ca72a1c4ab9b6fa066bda67a2)`(string configFile,IntPtr stdOut,IntPtr stdErr)` | //TODO See BIT-20 Create executor. Does not init database or start execution yet. +`public inline bool `[`InitChain`](#class_bitprim_1_1_executor_1a92769f0858fea0b489e9fea5fc49ad07)`()` | Initialize the local dabatase structure. +`public inline async Task< int > `[`RunAsync`](#class_bitprim_1_1_executor_1afc33e022d6b52ce8cde9a87e1ab54240)`()` | Starts running the node; blockchain starts synchronizing (downloading). The call returns right away, and the handler is invoked when the node actually starts running. +`public inline async Task< int > `[`InitAndRunAsync`](#class_bitprim_1_1_executor_1a699476f37e539c6e3558a3204aa5a386)`()` | Initialize if necessary and starts running the node; blockchain starts synchronizing (downloading). The call returns right away, and the handler is invoked when the node actually starts running. +`public inline void `[`Stop`](#class_bitprim_1_1_executor_1aac496e7361d58efefee7c4e09784085a)`()` | Stops the node; that includes all activies, such as synchronization and networking. +`public inline void `[`SubscribeToBlockChain`](#class_bitprim_1_1_executor_1a644be84a2244121e0e9a487f63430ed3)`(BlockHandler handler)` | Be notified (called back) when the local copy of the blockchain is reorganized. +`public inline void `[`SubscribeToTransaction`](#class_bitprim_1_1_executor_1a7470933138440e5abdd12a3c26b2dcae)`(TransactionHandler handler)` | Be notified (called back) when the local copy of the blockchain is updated at the transaction level. + +## Members + +#### `{property} bool `[`UseTestnetRules`](#class_bitprim_1_1_executor_1a72721235e276a2022424254285a89859) + +Returns true iif the current network is a testnet. + +#### `{property} `[`Chain`](#class_bitprim_1_1_chain)` `[`Chain`](#class_bitprim_1_1_executor_1ac610ccf2aeb37d042c6de111dc4af3d8) + +The node's query interface. Will be null until node starts running (i.e. Run or RunWait succeeded) + +#### `{property} NetworkType `[`NetworkType`](#class_bitprim_1_1_executor_1aaa0cd4c024e384cd8d0f99daebada6cd) + +The node's network. Won't be valid until node starts running (i.e. Run or RunWait succeeded) + +#### `{property} bool `[`IsStopped`](#class_bitprim_1_1_executor_1aa3d8e0c57065dc536ae997cf3d46340f) + +#### `{property} bool `[`IsLoadConfigValid`](#class_bitprim_1_1_executor_1af8b481e884520c67c9d348c32f6adcbb) + +#### `public delegate bool `[`BlockHandler`](#class_bitprim_1_1_executor_1aa8f3a08638a1c8a977c780be93c5cdf9)`(ErrorCode e,UInt64 u,BlockList incoming,BlockList outgoing)` + +#### `public delegate bool `[`TransactionHandler`](#class_bitprim_1_1_executor_1af552875e00ecb97f9529b6892d5fa9ed)`(ErrorCode e,`[`Transaction`](#class_bitprim_1_1_transaction)` newTx)` + +#### `public inline `[`Executor`](#class_bitprim_1_1_executor_1ac689798a0303fa5e0b289b9601ff4a41)`(string configFile)` + +Create executor. Does not init database or start execution yet. + +#### Parameters +* `configFile` Path to configuration file. + +#### `public inline `[`Executor`](#class_bitprim_1_1_executor_1a4a0a051ca72a1c4ab9b6fa066bda67a2)`(string configFile,IntPtr stdOut,IntPtr stdErr)` + +//TODO See BIT-20 Create executor. Does not init database or start execution yet. + +#### Parameters +* `configFile` Path to configuration file. + +* `stdOut` File descriptor for redirecting standard output. + +* `stdErr` File descriptor for redirecting standard error output. + +Create executor. Does not init database or start execution yet. + +#### Parameters +* `configFile` Path to configuration file. + +* `stdOut` Handle for redirecting standard output. + +* `stdErr` Handle for redirecting standard output. + +#### `public inline bool `[`InitChain`](#class_bitprim_1_1_executor_1a92769f0858fea0b489e9fea5fc49ad07)`()` + +Initialize the local dabatase structure. + +#### Returns +True iif local chain init succeeded + +#### `public inline async Task< int > `[`RunAsync`](#class_bitprim_1_1_executor_1afc33e022d6b52ce8cde9a87e1ab54240)`()` + +Starts running the node; blockchain starts synchronizing (downloading). The call returns right away, and the handler is invoked when the node actually starts running. + +#### Returns +Error code (0 = success) + +#### `public inline async Task< int > `[`InitAndRunAsync`](#class_bitprim_1_1_executor_1a699476f37e539c6e3558a3204aa5a386)`()` + +Initialize if necessary and starts running the node; blockchain starts synchronizing (downloading). The call returns right away, and the handler is invoked when the node actually starts running. + +#### Returns +Error code (0 = success) + +#### `public inline void `[`Stop`](#class_bitprim_1_1_executor_1aac496e7361d58efefee7c4e09784085a)`()` + +Stops the node; that includes all activies, such as synchronization and networking. + +#### `public inline void `[`SubscribeToBlockChain`](#class_bitprim_1_1_executor_1a644be84a2244121e0e9a487f63430ed3)`(BlockHandler handler)` + +Be notified (called back) when the local copy of the blockchain is reorganized. + +#### Parameters +* `handler` Callback which will be called when blocks are added or removed. The callback returns 3 parameters: + +* Height (UInt64): The chain height at which reorganization takes place + +* Incoming (Blocklist): Incoming blocks (added to the blockchain). + +* Outgoing (Blocklist): Outgoing blocks (removed from the blockchain). + +#### `public inline void `[`SubscribeToTransaction`](#class_bitprim_1_1_executor_1a7470933138440e5abdd12a3c26b2dcae)`(TransactionHandler handler)` + +Be notified (called back) when the local copy of the blockchain is updated at the transaction level. + +#### Parameters +* `handler` Callback which will be called when a transaction is added. + +# class `Bitprim::GetBlockDataResult` + +``` +class Bitprim::GetBlockDataResult + : public IDisposable +``` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} TBlockData `[`BlockData`](#class_bitprim_1_1_get_block_data_result_1a013cfb30f8e30d5be5060e3d4a76e8ae) | +`public UInt64 `[`BlockHeight`](#class_bitprim_1_1_get_block_data_result_1a3e82b7c4369b77cbce73ee9a3706782c) | + +## Members + +#### `{property} TBlockData `[`BlockData`](#class_bitprim_1_1_get_block_data_result_1a013cfb30f8e30d5be5060e3d4a76e8ae) + +#### `public UInt64 `[`BlockHeight`](#class_bitprim_1_1_get_block_data_result_1a3e82b7c4369b77cbce73ee9a3706782c) + +# class `Bitprim::GetBlockHashTimestampResult` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} byte [] `[`BlockHash`](#class_bitprim_1_1_get_block_hash_timestamp_result_1a3127c5bd7f9a1933717fbb6776201686) | +`{property} DateTime `[`BlockTimestamp`](#class_bitprim_1_1_get_block_hash_timestamp_result_1a6c1886de6a464b741711eb3652c06048) | + +## Members + +#### `{property} byte [] `[`BlockHash`](#class_bitprim_1_1_get_block_hash_timestamp_result_1a3127c5bd7f9a1933717fbb6776201686) + +#### `{property} DateTime `[`BlockTimestamp`](#class_bitprim_1_1_get_block_hash_timestamp_result_1a6c1886de6a464b741711eb3652c06048) + +# class `Bitprim::GetBlockHeaderByHashTxSizeResult` + +``` +class Bitprim::GetBlockHeaderByHashTxSizeResult + : public IDisposable +``` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} `[`GetBlockDataResult](#class_bitprim_1_1_get_block_data_result)< [Header`](#class_bitprim_1_1_header)` > `[`Block`](#class_bitprim_1_1_get_block_header_by_hash_tx_size_result_1a97201cdcf7cf4749ef689702548487bb) | +`{property} HashList `[`TransactionHashes`](#class_bitprim_1_1_get_block_header_by_hash_tx_size_result_1ab1345bebf999bf84b624d0f5e5056e33) | +`{property} UInt64 `[`SerializedBlockSize`](#class_bitprim_1_1_get_block_header_by_hash_tx_size_result_1a5f31bf3c48d635040732b6a4d2137a9d) | + +## Members + +#### `{property} `[`GetBlockDataResult](#class_bitprim_1_1_get_block_data_result)< [Header`](#class_bitprim_1_1_header)` > `[`Block`](#class_bitprim_1_1_get_block_header_by_hash_tx_size_result_1a97201cdcf7cf4749ef689702548487bb) + +#### `{property} HashList `[`TransactionHashes`](#class_bitprim_1_1_get_block_header_by_hash_tx_size_result_1ab1345bebf999bf84b624d0f5e5056e33) + +#### `{property} UInt64 `[`SerializedBlockSize`](#class_bitprim_1_1_get_block_header_by_hash_tx_size_result_1a5f31bf3c48d635040732b6a4d2137a9d) + +# class `Bitprim::GetTxDataResult` + +``` +class Bitprim::GetTxDataResult + : public IDisposable +``` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} `[`Transaction`](#class_bitprim_1_1_transaction)` `[`Tx`](#class_bitprim_1_1_get_tx_data_result_1a4f036251320b983dd69f1248d551f0ad) | +`{property} `[`GetTxPositionResult`](#struct_bitprim_1_1_get_tx_position_result)` `[`TxPosition`](#class_bitprim_1_1_get_tx_data_result_1a949a8d7dd542949d78026f7c2aa4ec2d) | + +## Members + +#### `{property} `[`Transaction`](#class_bitprim_1_1_transaction)` `[`Tx`](#class_bitprim_1_1_get_tx_data_result_1a4f036251320b983dd69f1248d551f0ad) + +#### `{property} `[`GetTxPositionResult`](#struct_bitprim_1_1_get_tx_position_result)` `[`TxPosition`](#class_bitprim_1_1_get_tx_data_result_1a949a8d7dd542949d78026f7c2aa4ec2d) + +# class `Bitprim::Header` + +``` +class Bitprim::Header + : public IDisposable +``` + +Represents a full Bitcoin blockchain block. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`IsValid`](#class_bitprim_1_1_header_1a8018db3ab9a37c742a0cc89cca654973) | Returns true if and only if the header conforms to the Bitcoin protocol format. +`{property} byte [] `[`Hash`](#class_bitprim_1_1_header_1a1d763bfd0a000b5b1d7a7285ffcd61d7) | [Block](#class_bitprim_1_1_block) hash in 32 byte array format. +`{property} byte [] `[`Merkle`](#class_bitprim_1_1_header_1a96282c190970dfc86a35294825d3c3e5) | Merkle root in 32 byte array format. +`{property} byte [] `[`PreviousBlockHash`](#class_bitprim_1_1_header_1aa48ea17b65f4177086ab174233c9ad1a) | Hash belonging to the immediately previous block in the blockchain, as a 32 byte array. This is all zeros for the first block, a.k.a. Genesis. +`{property} string `[`ProofString`](#class_bitprim_1_1_header_1a1756a2bc8e312654ad8f02e917db5045) | Hexadecimal string representation of the block's proof (which is a 256-bit number). +`{property} UInt32 `[`Bits`](#class_bitprim_1_1_header_1afacb1dc4ac2169c218801dc54cad37ca) | Difficulty threshold. +`{property} UInt32 `[`Nonce`](#class_bitprim_1_1_header_1ac6a6f369a44e845082240ddd86f202d9) | The nonce that allowed this block to be added to the blockchain. +`{property} UInt32 `[`Timestamp`](#class_bitprim_1_1_header_1a745d573ec4c70b1a67fca156faca6dfa) | [Block](#class_bitprim_1_1_block) timestamp in UNIX Epoch format (seconds since January 1st 1970) Assume UTC 0. +`{property} UInt32 `[`Version`](#class_bitprim_1_1_header_1a9189d2afec1ba7d21f10aa776d3ac490) | [Header](#class_bitprim_1_1_header) protocol version. + +## Members + +#### `{property} bool `[`IsValid`](#class_bitprim_1_1_header_1a8018db3ab9a37c742a0cc89cca654973) + +Returns true if and only if the header conforms to the Bitcoin protocol format. + +#### `{property} byte [] `[`Hash`](#class_bitprim_1_1_header_1a1d763bfd0a000b5b1d7a7285ffcd61d7) + +[Block](#class_bitprim_1_1_block) hash in 32 byte array format. + +#### `{property} byte [] `[`Merkle`](#class_bitprim_1_1_header_1a96282c190970dfc86a35294825d3c3e5) + +Merkle root in 32 byte array format. + +#### `{property} byte [] `[`PreviousBlockHash`](#class_bitprim_1_1_header_1aa48ea17b65f4177086ab174233c9ad1a) + +Hash belonging to the immediately previous block in the blockchain, as a 32 byte array. This is all zeros for the first block, a.k.a. Genesis. + +#### `{property} string `[`ProofString`](#class_bitprim_1_1_header_1a1756a2bc8e312654ad8f02e917db5045) + +Hexadecimal string representation of the block's proof (which is a 256-bit number). + +#### `{property} UInt32 `[`Bits`](#class_bitprim_1_1_header_1afacb1dc4ac2169c218801dc54cad37ca) + +Difficulty threshold. + +#### `{property} UInt32 `[`Nonce`](#class_bitprim_1_1_header_1ac6a6f369a44e845082240ddd86f202d9) + +The nonce that allowed this block to be added to the blockchain. + +#### `{property} UInt32 `[`Timestamp`](#class_bitprim_1_1_header_1a745d573ec4c70b1a67fca156faca6dfa) + +[Block](#class_bitprim_1_1_block) timestamp in UNIX Epoch format (seconds since January 1st 1970) Assume UTC 0. + +#### `{property} UInt32 `[`Version`](#class_bitprim_1_1_header_1a9189d2afec1ba7d21f10aa776d3ac490) + +[Header](#class_bitprim_1_1_header) protocol version. + +# class `Bitprim::HeaderReader` + +``` +class Bitprim::HeaderReader + : public IDisposable +``` + +Helper for reading the header for each block in a specific set of blocks. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`IsValid`](#class_bitprim_1_1_header_reader_1a3471f7b55cfb7695d79ca8e13cfcf0a0) | The block set is valid iif all its blocks are valid. +`{property} byte [] `[`StopHash`](#class_bitprim_1_1_header_reader_1a98cbc6c314c8ddb5472916b7fbefc4f7) | Stop at this block (include it in the set). +`{property} HashList `[`StartHashes`](#class_bitprim_1_1_header_reader_1a6f8d968aae0e6240dffbc554a2e8ba82) | Define when to start reading: Once these blocks are synced (include the newest one). +`public inline `[`HeaderReader`](#class_bitprim_1_1_header_reader_1aa4b325abd6a521e1949edea884778052)`()` | Create an empty reader. +`public inline `[`HeaderReader`](#class_bitprim_1_1_header_reader_1a2eee57e87b2ea5e3f609f949c71a707e)`(HashList start,byte [] stop)` | Create a reader with predefined start hashes and stop hash. +`public inline UInt64 `[`GetSerializedSize`](#class_bitprim_1_1_header_reader_1a77e3422d9b7b76a956924c3611e6e989)`(UInt32 version)` | The sum of the header sizes for this set. +`public inline void `[`Reset`](#class_bitprim_1_1_header_reader_1aa60467a083c4867ec266e611f13c580e)`()` | Go back to first block in the set. + +## Members + +#### `{property} bool `[`IsValid`](#class_bitprim_1_1_header_reader_1a3471f7b55cfb7695d79ca8e13cfcf0a0) + +The block set is valid iif all its blocks are valid. + +#### `{property} byte [] `[`StopHash`](#class_bitprim_1_1_header_reader_1a98cbc6c314c8ddb5472916b7fbefc4f7) + +Stop at this block (include it in the set). + +#### `{property} HashList `[`StartHashes`](#class_bitprim_1_1_header_reader_1a6f8d968aae0e6240dffbc554a2e8ba82) + +Define when to start reading: Once these blocks are synced (include the newest one). + +#### `public inline `[`HeaderReader`](#class_bitprim_1_1_header_reader_1aa4b325abd6a521e1949edea884778052)`()` + +Create an empty reader. + +#### `public inline `[`HeaderReader`](#class_bitprim_1_1_header_reader_1a2eee57e87b2ea5e3f609f949c71a707e)`(HashList start,byte [] stop)` + +Create a reader with predefined start hashes and stop hash. + +#### Parameters +* `start` When all of these blocks are synced, start reading. + +* `stop` Stop at this block. + +#### `public inline UInt64 `[`GetSerializedSize`](#class_bitprim_1_1_header_reader_1a77e3422d9b7b76a956924c3611e6e989)`(UInt32 version)` + +The sum of the header sizes for this set. + +#### Parameters +* `version` Protocol version to consider when calculating header size. + +#### Returns +Sum of header sizes. + +#### `public inline void `[`Reset`](#class_bitprim_1_1_header_reader_1aa60467a083c4867ec266e611f13c580e)`()` + +Go back to first block in the set. + +# class `Bitprim::HistoryCompact` + +``` +class Bitprim::HistoryCompact + : public IDisposable +``` + +[Output](#class_bitprim_1_1_output) points, values, and spends for a payment address. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} `[`Point`](#class_bitprim_1_1_point)` `[`Point`](#class_bitprim_1_1_history_compact_1a5f18863c354bf692f1fe325b311654b0) | The point that identifies the History instance. +`{property} UInt32 `[`Height`](#class_bitprim_1_1_history_compact_1a41e320774dfb5a2ecb0d6c8617087d06) | Height of the block containing the [Point](#class_bitprim_1_1_point). +`{property} UInt64 `[`ValueOrChecksum`](#class_bitprim_1_1_history_compact_1ad00b564aafa4f603347d6e387bc654a6) | Varies depending on point_kind. + +## Members + +#### `{property} `[`Point`](#class_bitprim_1_1_point)` `[`Point`](#class_bitprim_1_1_history_compact_1a5f18863c354bf692f1fe325b311654b0) + +The point that identifies the History instance. + +#### `{property} UInt32 `[`Height`](#class_bitprim_1_1_history_compact_1a41e320774dfb5a2ecb0d6c8617087d06) + +Height of the block containing the [Point](#class_bitprim_1_1_point). + +#### `{property} UInt64 `[`ValueOrChecksum`](#class_bitprim_1_1_history_compact_1ad00b564aafa4f603347d6e387bc654a6) + +Varies depending on point_kind. + +# class `Bitprim::Input` + +``` +class Bitprim::Input + : public IDisposable +``` + +Represents a [Transaction](#class_bitprim_1_1_transaction) input. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`IsFinal`](#class_bitprim_1_1_input_1a51424ae4e6979cced244ba27bf563644) | Returns 1 iif sequence is equal to max_sequence. +`{property} bool `[`IsValid`](#class_bitprim_1_1_input_1aa45cc1562e08b08903f0c49af101edaf) | Returns false if and only if previous outputs or input script are invalid. +`{property} `[`OutputPoint`](#class_bitprim_1_1_output_point)` `[`PreviousOutput`](#class_bitprim_1_1_input_1a047409c5f428227e0aa235a2a8b85687) | Returns a reference to the previous output, as an [OutputPoint](#class_bitprim_1_1_output_point): a transaction hash and index pair. +`{property} `[`Script`](#class_bitprim_1_1_script)` `[`Script`](#class_bitprim_1_1_input_1a33808f7bd1eac8590448bebe1d7ddbde) | The input's script. +`{property} UInt32 `[`Sequence`](#class_bitprim_1_1_input_1ad4a1d451642e545c15a8d842092e5815) | Zero-based index for the input in the transaction's input set. +`{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_input_1a265f01ce48cb932e89306bae4f9d2835) | +`public inline `[`Input`](#class_bitprim_1_1_input_1a978df7845edc1c18e44cc7f9e9ad0ee4)`()` | Create an empty input. +`public inline `[`Input`](#class_bitprim_1_1_input_1a6e5b9353656c7e4d94f3645e674e0442)`(`[`Output`](#class_bitprim_1_1_output)` previousOutput,`[`Script`](#class_bitprim_1_1_script)` script,UInt32 sequence)` | Create an input from a previous output, a script and a sequence number. +`public inline UInt64 `[`GetSerializedSize`](#class_bitprim_1_1_input_1af185363b5b7723afd29117dc629e55c0)`(bool wire)` | [Input](#class_bitprim_1_1_input) size in bytes. +`public inline UInt64 `[`GetSignatureOperationsCount`](#class_bitprim_1_1_input_1a7f34e170a185bda655ef1df84ec38b92)`(bool bip16Active)` | Total amount of sigops (signature operations) in the input script. + +## Members + +#### `{property} bool `[`IsFinal`](#class_bitprim_1_1_input_1a51424ae4e6979cced244ba27bf563644) + +Returns 1 iif sequence is equal to max_sequence. + +#### `{property} bool `[`IsValid`](#class_bitprim_1_1_input_1aa45cc1562e08b08903f0c49af101edaf) + +Returns false if and only if previous outputs or input script are invalid. + +#### `{property} `[`OutputPoint`](#class_bitprim_1_1_output_point)` `[`PreviousOutput`](#class_bitprim_1_1_input_1a047409c5f428227e0aa235a2a8b85687) + +Returns a reference to the previous output, as an [OutputPoint](#class_bitprim_1_1_output_point): a transaction hash and index pair. + +#### `{property} `[`Script`](#class_bitprim_1_1_script)` `[`Script`](#class_bitprim_1_1_input_1a33808f7bd1eac8590448bebe1d7ddbde) + +The input's script. + +#### `{property} UInt32 `[`Sequence`](#class_bitprim_1_1_input_1ad4a1d451642e545c15a8d842092e5815) + +Zero-based index for the input in the transaction's input set. + +#### `{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_input_1a265f01ce48cb932e89306bae4f9d2835) + +#### `public inline `[`Input`](#class_bitprim_1_1_input_1a978df7845edc1c18e44cc7f9e9ad0ee4)`()` + +Create an empty input. + +#### `public inline `[`Input`](#class_bitprim_1_1_input_1a6e5b9353656c7e4d94f3645e674e0442)`(`[`Output`](#class_bitprim_1_1_output)` previousOutput,`[`Script`](#class_bitprim_1_1_script)` script,UInt32 sequence)` + +Create an input from a previous output, a script and a sequence number. + +#### Parameters +* `previousOutput` The output to spend. + +* `script` [Input](#class_bitprim_1_1_input) script. + +* `sequence` Zero-based, indexes this input in the input set. + +#### `public inline UInt64 `[`GetSerializedSize`](#class_bitprim_1_1_input_1af185363b5b7723afd29117dc629e55c0)`(bool wire)` + +[Input](#class_bitprim_1_1_input) size in bytes. + +#### Parameters +* `wire` Iif true, consider 4 extra bytes from wire field. + +#### Returns +Size in bytes. + +#### `public inline UInt64 `[`GetSignatureOperationsCount`](#class_bitprim_1_1_input_1a7f34e170a185bda655ef1df84ec38b92)`(bool bip16Active)` + +Total amount of sigops (signature operations) in the input script. + +#### Parameters +* `bip16Active` Iif true, count BIP 16 active sig ops + +#### Returns +Sigops count. + +# class `Bitprim::MempoolTransaction` + +Represents an unconfirmed transaction. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} string `[`Address`](#class_bitprim_1_1_mempool_transaction_1a61e4bbd9d8201c7ac14eb7a1f48350c1) | [Transaction](#class_bitprim_1_1_transaction) output address +`{property} string `[`Hash`](#class_bitprim_1_1_mempool_transaction_1aef304d5e820d9162a034c6efbd96f5e8) | [Transaction](#class_bitprim_1_1_transaction) hash (unique identifier) +`{property} string `[`PreviousOutputHash`](#class_bitprim_1_1_mempool_transaction_1a76cbffed7754634acee9ed314f5915ea) | Previous output transaction hash +`{property} string `[`PreviousOutputIndex`](#class_bitprim_1_1_mempool_transaction_1a5f31bb697115574c6c095145bd6479a2) | Previous output transaction index +`{property} string `[`Satoshis`](#class_bitprim_1_1_mempool_transaction_1a1235a85eaeb1c61f6e6ac09f7bd8dcc3) | Sum of output values in Satoshis +`{property} UInt64 `[`Index`](#class_bitprim_1_1_mempool_transaction_1a60b3549786221cc6e08492d430c0f132) | [Transaction](#class_bitprim_1_1_transaction) index +`{property} UInt64 `[`Timestamp`](#class_bitprim_1_1_mempool_transaction_1aa8aad1f71eae1b4f05594b037f8963af) | [Transaction](#class_bitprim_1_1_transaction) timestamp +`{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_mempool_transaction_1ac262d612648d499a6cb123667560eece) | + +## Members + +#### `{property} string `[`Address`](#class_bitprim_1_1_mempool_transaction_1a61e4bbd9d8201c7ac14eb7a1f48350c1) + +[Transaction](#class_bitprim_1_1_transaction) output address + +#### `{property} string `[`Hash`](#class_bitprim_1_1_mempool_transaction_1aef304d5e820d9162a034c6efbd96f5e8) + +[Transaction](#class_bitprim_1_1_transaction) hash (unique identifier) + +#### `{property} string `[`PreviousOutputHash`](#class_bitprim_1_1_mempool_transaction_1a76cbffed7754634acee9ed314f5915ea) + +Previous output transaction hash + +#### `{property} string `[`PreviousOutputIndex`](#class_bitprim_1_1_mempool_transaction_1a5f31bb697115574c6c095145bd6479a2) + +Previous output transaction index + +#### `{property} string `[`Satoshis`](#class_bitprim_1_1_mempool_transaction_1a1235a85eaeb1c61f6e6ac09f7bd8dcc3) + +Sum of output values in Satoshis + +#### `{property} UInt64 `[`Index`](#class_bitprim_1_1_mempool_transaction_1a60b3549786221cc6e08492d430c0f132) + +[Transaction](#class_bitprim_1_1_transaction) index + +#### `{property} UInt64 `[`Timestamp`](#class_bitprim_1_1_mempool_transaction_1aa8aad1f71eae1b4f05594b037f8963af) + +[Transaction](#class_bitprim_1_1_transaction) timestamp + +#### `{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_mempool_transaction_1ac262d612648d499a6cb123667560eece) + +# class `Bitprim::MerkleBlock` + +``` +class Bitprim::MerkleBlock + : public IDisposable +``` + +Merkle tree representation of a blockchain block. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`IsValid`](#class_bitprim_1_1_merkle_block_1af1579794d62800b1e7712c7eeb5400c3) | Returns true if and only if it the block contains txs hashes, and the header is valid. +`{property} `[`Header`](#class_bitprim_1_1_header)` `[`Header`](#class_bitprim_1_1_merkle_block_1a56bf0f704c9ba7e474922b1a2fc18f0b) | The block's header. +`{property} UInt64 `[`HashCount`](#class_bitprim_1_1_merkle_block_1a9d489bfd505f89564069460ae835cca6) | [Transaction](#class_bitprim_1_1_transaction) hashes list element count. +`{property} UInt64 `[`TotalTransactionCount`](#class_bitprim_1_1_merkle_block_1a91fc331d0290c174dd4609d5231e3df6) | Amount of transactions inside the block. +`public inline byte [] `[`GetNthHash`](#class_bitprim_1_1_merkle_block_1a787be0b2fd6fc5f291c0e425ae2c2b67)`(int n)` | Get the Nth transaction hash from the block. +`public inline UInt64 `[`GetSerializedSize`](#class_bitprim_1_1_merkle_block_1af770044cf3e054454d56cc4cd85765d0)`(UInt32 version)` | [Block](#class_bitprim_1_1_block) size in bytes (as a Merkle block, not as a full block). +`public inline void `[`Reset`](#class_bitprim_1_1_merkle_block_1aa98bfea570cfd6816d98559421d3f505)`()` | Delete all the data inside the block. + +## Members + +#### `{property} bool `[`IsValid`](#class_bitprim_1_1_merkle_block_1af1579794d62800b1e7712c7eeb5400c3) + +Returns true if and only if it the block contains txs hashes, and the header is valid. + +#### `{property} `[`Header`](#class_bitprim_1_1_header)` `[`Header`](#class_bitprim_1_1_merkle_block_1a56bf0f704c9ba7e474922b1a2fc18f0b) + +The block's header. + +#### `{property} UInt64 `[`HashCount`](#class_bitprim_1_1_merkle_block_1a9d489bfd505f89564069460ae835cca6) + +[Transaction](#class_bitprim_1_1_transaction) hashes list element count. + +#### `{property} UInt64 `[`TotalTransactionCount`](#class_bitprim_1_1_merkle_block_1a91fc331d0290c174dd4609d5231e3df6) + +Amount of transactions inside the block. + +#### `public inline byte [] `[`GetNthHash`](#class_bitprim_1_1_merkle_block_1a787be0b2fd6fc5f291c0e425ae2c2b67)`(int n)` + +Get the Nth transaction hash from the block. + +#### Parameters +* `n` Zerp-based index. + +#### Returns +[Transaction](#class_bitprim_1_1_transaction) hash in 32 byte array format. + +#### `public inline UInt64 `[`GetSerializedSize`](#class_bitprim_1_1_merkle_block_1af770044cf3e054454d56cc4cd85765d0)`(UInt32 version)` + +[Block](#class_bitprim_1_1_block) size in bytes (as a Merkle block, not as a full block). + +#### Parameters +* `version` Protocol version to consider when calculating size. + +#### Returns +Size in bytes. + +#### `public inline void `[`Reset`](#class_bitprim_1_1_merkle_block_1aa98bfea570cfd6816d98559421d3f505)`()` + +Delete all the data inside the block. + +# class `Bitprim::NativeBuffer` + +``` +class Bitprim::NativeBuffer + : public IDisposable +``` + +RAII wrapper for native memory. Guarantees that even if an exception is thrown, platform_free will be used to release it. Also, it prevents the user from forgetting to call platform_free. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} IntPtr `[`NativePtr`](#class_bitprim_1_1_native_buffer_1af5e2a12866803d63e6ebce17391ed1e7) | +`public inline `[`NativeBuffer`](#class_bitprim_1_1_native_buffer_1a2858b61a12dd4a344055291a9ce947ae)`(IntPtr nativePtr)` | +`public inline byte [] `[`CopyToManagedArray`](#class_bitprim_1_1_native_buffer_1a20edd41586cd1a5582fd4e2ba48cce75)`(int arraySize)` | + +## Members + +#### `{property} IntPtr `[`NativePtr`](#class_bitprim_1_1_native_buffer_1af5e2a12866803d63e6ebce17391ed1e7) + +#### `public inline `[`NativeBuffer`](#class_bitprim_1_1_native_buffer_1a2858b61a12dd4a344055291a9ce947ae)`(IntPtr nativePtr)` + +#### `public inline byte [] `[`CopyToManagedArray`](#class_bitprim_1_1_native_buffer_1a20edd41586cd1a5582fd4e2ba48cce75)`(int arraySize)` + +# class `Bitprim::NativeString` + +``` +class Bitprim::NativeString + : public Bitprim.NativeBuffer +``` + +RAII wrapper for native strings. Guarantees that even if an exception is thrown, platform_free will be used to release the native memory. Also, it prevents the user from forgetting to call platform_free. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public inline `[`NativeString`](#class_bitprim_1_1_native_string_1a2cf067d18afd3c84006f77ca4089dc0b)`(IntPtr nativePtr)` | +`public override string `[`ToString`](#class_bitprim_1_1_native_string_1ad8b8bfd580eb2ef8789fcbb2dd72d201)`()` | + +## Members + +#### `public inline `[`NativeString`](#class_bitprim_1_1_native_string_1a2cf067d18afd3c84006f77ca4089dc0b)`(IntPtr nativePtr)` + +#### `public override string `[`ToString`](#class_bitprim_1_1_native_string_1ad8b8bfd580eb2ef8789fcbb2dd72d201)`()` + +# class `Bitprim::NodeSettings` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} CurrencyType `[`CurrencyType`](#class_bitprim_1_1_node_settings_1afca824023b908da53cbbfd01b1dca4fc) | + +## Members + +#### `{property} CurrencyType `[`CurrencyType`](#class_bitprim_1_1_node_settings_1afca824023b908da53cbbfd01b1dca4fc) + +# class `Bitprim::Output` + +``` +class Bitprim::Output + : public IDisposable +``` + +Represents one of the outputs of a [Transaction](#class_bitprim_1_1_transaction). + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`IsValid`](#class_bitprim_1_1_output_1a787e7f1f897f2970c666808dc10b2e18) | Returns false if and only if output is not found. +`{property} `[`Script`](#class_bitprim_1_1_script)` `[`Script`](#class_bitprim_1_1_output_1a482ee34dee529ef3751f57b376967099) | [Output](#class_bitprim_1_1_output) script. +`{property} UInt64 `[`Value`](#class_bitprim_1_1_output_1a6d99343413e43c096df4e8b36e04a70d) | Spend, in Satoshis. +`{property} UInt64 `[`SignatureOperationCount`](#class_bitprim_1_1_output_1a82549fe1b06952db62aee4bbfa52dc0f) | The amount of signature operations in the output script. +`{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_output_1ad4d9c3eb131262fba8e97687f4c08b6a) | +`public inline `[`Output`](#class_bitprim_1_1_output_1aaa64429487aec9a987c5b944a9bed5d6)`()` | Create an empty output. +`public inline `[`Output`](#class_bitprim_1_1_output_1a2550a08df3ed832691624537845c114e)`(UInt64 value,`[`Script`](#class_bitprim_1_1_script)` script)` | Create an output from a value and a script. +`public inline `[`PaymentAddress`](#class_bitprim_1_1_payment_address)` `[`PaymentAddress`](#class_bitprim_1_1_output_1aad82ee12e358b7c75cedfbd7f868b918)`(bool useTestnetRules)` | +`public inline UInt64 `[`GetSerializedSize`](#class_bitprim_1_1_output_1a4b88b89c3080b561fda08264cc170918)`(bool wire)` | [Output](#class_bitprim_1_1_output) size in bytes. + +## Members + +#### `{property} bool `[`IsValid`](#class_bitprim_1_1_output_1a787e7f1f897f2970c666808dc10b2e18) + +Returns false if and only if output is not found. + +#### `{property} `[`Script`](#class_bitprim_1_1_script)` `[`Script`](#class_bitprim_1_1_output_1a482ee34dee529ef3751f57b376967099) + +[Output](#class_bitprim_1_1_output) script. + +#### `{property} UInt64 `[`Value`](#class_bitprim_1_1_output_1a6d99343413e43c096df4e8b36e04a70d) + +Spend, in Satoshis. + +#### `{property} UInt64 `[`SignatureOperationCount`](#class_bitprim_1_1_output_1a82549fe1b06952db62aee4bbfa52dc0f) + +The amount of signature operations in the output script. + +#### `{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_output_1ad4d9c3eb131262fba8e97687f4c08b6a) + +#### `public inline `[`Output`](#class_bitprim_1_1_output_1aaa64429487aec9a987c5b944a9bed5d6)`()` + +Create an empty output. + +#### `public inline `[`Output`](#class_bitprim_1_1_output_1a2550a08df3ed832691624537845c114e)`(UInt64 value,`[`Script`](#class_bitprim_1_1_script)` script)` + +Create an output from a value and a script. + +#### Parameters +* `value` In Satoshis. + +* `script` [Output](#class_bitprim_1_1_output) script. + +#### `public inline `[`PaymentAddress`](#class_bitprim_1_1_payment_address)` `[`PaymentAddress`](#class_bitprim_1_1_output_1aad82ee12e358b7c75cedfbd7f868b918)`(bool useTestnetRules)` + +#### `public inline UInt64 `[`GetSerializedSize`](#class_bitprim_1_1_output_1a4b88b89c3080b561fda08264cc170918)`(bool wire)` + +[Output](#class_bitprim_1_1_output) size in bytes. + +#### Parameters +* `wire` If true, size will include size of 'uint32' for storing spender height. + +#### Returns +Size in bytes. + +# class `Bitprim::OutputPoint` + +``` +class Bitprim::OutputPoint + : public IDisposable +``` + +[Transaction](#class_bitprim_1_1_transaction) hash and index pair representing one of the transaction outputs. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} byte [] `[`Hash`](#class_bitprim_1_1_output_point_1a633f597c1dc5978be3fa61442ecf1304) | [Transaction](#class_bitprim_1_1_transaction) hash in 32 byte array format. +`{property} UInt32 `[`Index`](#class_bitprim_1_1_output_point_1a599509fe9e21990c4fa6c3e7ac132e01) | [Transaction](#class_bitprim_1_1_transaction) index (zero-based). +`{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_output_point_1a0d223bbc27f0813aae961639d04fa0b1) | +`public inline `[`OutputPoint`](#class_bitprim_1_1_output_point_1a8a7e0600afba5d8588044c43313ef839)`()` | Create an empty output point. +`public inline `[`OutputPoint`](#class_bitprim_1_1_output_point_1ac8741426c93c781a0aefc96c97d229dd)`(byte [] pointHash,UInt32 index)` | Create an output point from a hash and index pair. + +## Members + +#### `{property} byte [] `[`Hash`](#class_bitprim_1_1_output_point_1a633f597c1dc5978be3fa61442ecf1304) + +[Transaction](#class_bitprim_1_1_transaction) hash in 32 byte array format. + +#### `{property} UInt32 `[`Index`](#class_bitprim_1_1_output_point_1a599509fe9e21990c4fa6c3e7ac132e01) + +[Transaction](#class_bitprim_1_1_transaction) index (zero-based). + +#### `{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_output_point_1a0d223bbc27f0813aae961639d04fa0b1) + +#### `public inline `[`OutputPoint`](#class_bitprim_1_1_output_point_1a8a7e0600afba5d8588044c43313ef839)`()` + +Create an empty output point. + +#### `public inline `[`OutputPoint`](#class_bitprim_1_1_output_point_1ac8741426c93c781a0aefc96c97d229dd)`(byte [] pointHash,UInt32 index)` + +Create an output point from a hash and index pair. + +#### Parameters +* `pointHash` +* `index` + +# class `Bitprim::PaymentAddress` + +``` +class Bitprim::PaymentAddress + : public IDisposable +``` + +Represents a Bitcoin wallet address. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`IsValid`](#class_bitprim_1_1_payment_address_1a820450637d2e497dffc15f6e6905cce6) | Returns true iif this is a valid Base58 address. +`{property} byte `[`Version`](#class_bitprim_1_1_payment_address_1ad785a31e82e3260d29a238856bfee4bd) | Address version. +`{property} string `[`Encoded`](#class_bitprim_1_1_payment_address_1ab01d95e4aa1c7bd59e4817dca4dc0888) | Human readable representation. +`{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_payment_address_1a7613293266b7839dea0b8c6d86aa8002) | +`public inline `[`PaymentAddress`](#class_bitprim_1_1_payment_address_1ac7aba66544c8e97f631bbfa70983162e)`(string hexString)` | Create an address from its hex string representation. + +## Members + +#### `{property} bool `[`IsValid`](#class_bitprim_1_1_payment_address_1a820450637d2e497dffc15f6e6905cce6) + +Returns true iif this is a valid Base58 address. + +#### `{property} byte `[`Version`](#class_bitprim_1_1_payment_address_1ad785a31e82e3260d29a238856bfee4bd) + +Address version. + +#### `{property} string `[`Encoded`](#class_bitprim_1_1_payment_address_1ab01d95e4aa1c7bd59e4817dca4dc0888) + +Human readable representation. + +#### `{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_payment_address_1a7613293266b7839dea0b8c6d86aa8002) + +#### `public inline `[`PaymentAddress`](#class_bitprim_1_1_payment_address_1ac7aba66544c8e97f631bbfa70983162e)`(string hexString)` + +Create an address from its hex string representation. + +#### Parameters +* `hexString` + +# class `Bitprim::Point` + +Represents one of the transaction inputs. It's a transaction hash and index pair. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`IsValid`](#class_bitprim_1_1_point_1adefc84e6edb7fa3725f2180f544f180b) | Returns true if and only if this point is not null. +`{property} byte [] `[`Hash`](#class_bitprim_1_1_point_1a867ca6d798e69ab40d29cf493cf4143a) | [Transaction](#class_bitprim_1_1_transaction) hash in 32 byte array format. +`{property} UInt32 `[`Index`](#class_bitprim_1_1_point_1a4ede31b4009d9671bd2177c1fbe7104a) | [Input](#class_bitprim_1_1_input) position in the transaction (zero-based). +`{property} UInt64 `[`Checksum`](#class_bitprim_1_1_point_1aaf47ce470cbe1d9c1aea175757cdf623) | This is used with [OutputPoint](#class_bitprim_1_1_output_point) identification within a set of history rows of the same address. +`{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_point_1a8017dde6032feadab8acc32a7691cdd0) | + +## Members + +#### `{property} bool `[`IsValid`](#class_bitprim_1_1_point_1adefc84e6edb7fa3725f2180f544f180b) + +Returns true if and only if this point is not null. + +#### `{property} byte [] `[`Hash`](#class_bitprim_1_1_point_1a867ca6d798e69ab40d29cf493cf4143a) + +[Transaction](#class_bitprim_1_1_transaction) hash in 32 byte array format. + +#### `{property} UInt32 `[`Index`](#class_bitprim_1_1_point_1a4ede31b4009d9671bd2177c1fbe7104a) + +[Input](#class_bitprim_1_1_input) position in the transaction (zero-based). + +#### `{property} UInt64 `[`Checksum`](#class_bitprim_1_1_point_1aaf47ce470cbe1d9c1aea175757cdf623) + +This is used with [OutputPoint](#class_bitprim_1_1_output_point) identification within a set of history rows of the same address. + +#### `{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_point_1a8017dde6032feadab8acc32a7691cdd0) + +# class `Bitprim::Script` + +``` +class Bitprim::Script + : public IDisposable +``` + +Represents a transaction script. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`IsValid`](#class_bitprim_1_1_script_1aa6762b4acd4945c1b648ddd55802a430) | All script bytes are valid under some circumstance (e.g. coinbase). +`{property} bool `[`OperationsAreValid`](#class_bitprim_1_1_script_1a3047f3d01ea8e30a429c2004ae20e500) | [Script](#class_bitprim_1_1_script) validity is independent of individual operation validity. Operations are considered invalid if there is a trailing invalid/default op or if a push op has a size mismatch. +`{property} string `[`Type`](#class_bitprim_1_1_script_1ac3c48921a18d3864acbdf6937a8724a6) | [Script](#class_bitprim_1_1_script) type +`{property} UInt64 `[`SatoshiContentSize`](#class_bitprim_1_1_script_1a73ee4ba9eb69e6caae61756fd995427b) | Size in bytes. +`{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_script_1a1532f7d9458f9766de2fc79a8213d1f9) | +`public inline byte [] `[`ToData`](#class_bitprim_1_1_script_1a51e7a2f14655e6431b21e39f7abedfa8)`(bool prefix)` | Raw script data +`public inline string `[`ToString`](#class_bitprim_1_1_script_1a7230eca6520c7b466e50ba9cdacf52c4)`(UInt32 activeForks)` | Translate operations in the script to a string. +`public inline UInt64 `[`GetEmbeddedSigOps`](#class_bitprim_1_1_script_1a41f6fc1d3554e6e0736eeb0e5622b89f)`(`[`Script`](#class_bitprim_1_1_script)` prevOutScript)` | Count the sigops in the embedded script using BIP16 rules. +`public inline UInt64 `[`GetSigOps`](#class_bitprim_1_1_script_1a9d37fa88a73f37692b612697fb327066)`(bool embedded)` | Amount of signature operations in the script. + +## Members + +#### `{property} bool `[`IsValid`](#class_bitprim_1_1_script_1aa6762b4acd4945c1b648ddd55802a430) + +All script bytes are valid under some circumstance (e.g. coinbase). + +#### `{property} bool `[`OperationsAreValid`](#class_bitprim_1_1_script_1a3047f3d01ea8e30a429c2004ae20e500) + +[Script](#class_bitprim_1_1_script) validity is independent of individual operation validity. Operations are considered invalid if there is a trailing invalid/default op or if a push op has a size mismatch. + +#### `{property} string `[`Type`](#class_bitprim_1_1_script_1ac3c48921a18d3864acbdf6937a8724a6) + +[Script](#class_bitprim_1_1_script) type + +#### `{property} UInt64 `[`SatoshiContentSize`](#class_bitprim_1_1_script_1a73ee4ba9eb69e6caae61756fd995427b) + +Size in bytes. + +#### `{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_script_1a1532f7d9458f9766de2fc79a8213d1f9) + +#### `public inline byte [] `[`ToData`](#class_bitprim_1_1_script_1a51e7a2f14655e6431b21e39f7abedfa8)`(bool prefix)` + +Raw script data + +#### Parameters +* `prefix` Tells whether to include script size in data + +#### Returns +Byte array with script data + +#### `public inline string `[`ToString`](#class_bitprim_1_1_script_1a7230eca6520c7b466e50ba9cdacf52c4)`(UInt32 activeForks)` + +Translate operations in the script to a string. + +#### Parameters +* `activeForks` Tells which rule is active. + +#### Returns +Human readable script. + +#### `public inline UInt64 `[`GetEmbeddedSigOps`](#class_bitprim_1_1_script_1a41f6fc1d3554e6e0736eeb0e5622b89f)`(`[`Script`](#class_bitprim_1_1_script)` prevOutScript)` + +Count the sigops in the embedded script using BIP16 rules. + +#### Parameters +* `prevOutScript` Reference to previous output script. + +#### Returns +Embedded sigops count. + +#### `public inline UInt64 `[`GetSigOps`](#class_bitprim_1_1_script_1a9d37fa88a73f37692b612697fb327066)`(bool embedded)` + +Amount of signature operations in the script. + +#### Parameters +* `embedded` Iif true, consider this an embedded script. + +#### Returns +Sigops count. + +# class `Bitprim::StealthCompact` + +``` +class Bitprim::StealthCompact + : public IDisposable +``` + +Stealth payment related data. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} byte [] `[`EphemeralPublicKeyHash`](#class_bitprim_1_1_stealth_compact_1a7e981961a1a1fa41520c08cddcb8e1a7) | 33 bytes. Includes the sign byte (0x02). +`{property} byte [] `[`PublicKeyHash`](#class_bitprim_1_1_stealth_compact_1a4b079e4ca2dd42c7dfcecedf58d1c1c1) | Public key hash in 32 bytes array format. +`{property} byte [] `[`TransactionHash`](#class_bitprim_1_1_stealth_compact_1acccf8d9a07b8463f074f4d1c872d3425) | [Transaction](#class_bitprim_1_1_transaction) hash in 32 byte array format. + +## Members + +#### `{property} byte [] `[`EphemeralPublicKeyHash`](#class_bitprim_1_1_stealth_compact_1a7e981961a1a1fa41520c08cddcb8e1a7) + +33 bytes. Includes the sign byte (0x02). + +#### `{property} byte [] `[`PublicKeyHash`](#class_bitprim_1_1_stealth_compact_1a4b079e4ca2dd42c7dfcecedf58d1c1c1) + +Public key hash in 32 bytes array format. + +#### `{property} byte [] `[`TransactionHash`](#class_bitprim_1_1_stealth_compact_1acccf8d9a07b8463f074f4d1c872d3425) + +[Transaction](#class_bitprim_1_1_transaction) hash in 32 byte array format. + +# class `Bitprim::TaskHelper` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- + +## Members + +# class `Bitprim::Transaction` + +``` +class Bitprim::Transaction + : public IDisposable +``` + +Represents a Bitcoin transaction. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`IsCoinbase`](#class_bitprim_1_1_transaction_1ae3a362e097393cbf8c8087107ac202e5) | Returns true if and only if this is a coinbase transaction (i.e. generates new coins). +`{property} bool `[`IsLocktimeConflict`](#class_bitprim_1_1_transaction_1ad7b30b6fa7c3ddea8e0ab1541810ae7f) | Returns true if and only if the transaction is locked and every input is final, false otherwise. +`{property} bool `[`IsMissingPreviousOutputs`](#class_bitprim_1_1_transaction_1af10e0b3b68b2a6d2dac82c67fa0c1e23) | Returns true if and only if at least one of the previous outputs is invalid, false otherwise. +`{property} bool `[`IsNullNonCoinbase`](#class_bitprim_1_1_transaction_1a49c7429cd339e138f983102fb530a96a) | Return true if and only if the transaction is not coinbase and has a null previous output, false otherwise. +`{property} bool `[`IsOversizeCoinbase`](#class_bitprim_1_1_transaction_1a7ebc78d891b9f5e4d01e0acb6a2214d5) | Returns true if the transaction is coinbase and has an invalid script size on its first input. +`{property} bool `[`IsOverspent`](#class_bitprim_1_1_transaction_1a5cccf30e1c82353fe678c393eb80df71) | Returns true if transaction is not a coinbase, and the sum of its outputs is higher than the sum of its inputs, false otherwise. +`{property} bool `[`IsValid`](#class_bitprim_1_1_transaction_1a29b8a68de9c1828a6b540f5dc02508da) | Returns true if and only if this transaction is valid according to the protocol. +`{property} byte [] `[`Hash`](#class_bitprim_1_1_transaction_1a54d13bfb55819222e4f302e1f8de063c) | [Transaction](#class_bitprim_1_1_transaction) hash in 32 byte array format. +`{property} InputList `[`Inputs`](#class_bitprim_1_1_transaction_1a33d098c55beee1bb9d7ff598ace272bc) | A list with all the transaction inputs. +`{property} OutputList `[`Outputs`](#class_bitprim_1_1_transaction_1a8f7202ac3b2839b02ea07197d88e0cfb) | A list with all the transaction outputs. +`{property} UInt32 `[`Locktime`](#class_bitprim_1_1_transaction_1a9049d57c642ab63763e906539db8f04a) | [Transaction](#class_bitprim_1_1_transaction) locktime. +`{property} UInt32 `[`Version`](#class_bitprim_1_1_transaction_1ae76b215e44e8e0a225dcca697b21002d) | [Transaction](#class_bitprim_1_1_transaction) protocol version. +`{property} UInt64 `[`Fees`](#class_bitprim_1_1_transaction_1a27c37d65dff9cae8fed5e6a684e641b7) | Fees to pay to the winning miner. +`{property} UInt64 `[`SignatureOperations`](#class_bitprim_1_1_transaction_1a9de1208d6409d511b3fa1b74d7020539) | Amount of signature operations in the transaction. +`{property} UInt64 `[`TotalInputValue`](#class_bitprim_1_1_transaction_1a291ada37f6535b154a7123ca3eb534ef) | Sum of every input value in the transaction. +`{property} UInt64 `[`TotalOutputValue`](#class_bitprim_1_1_transaction_1a48315105df2e9ddf66ded983200e0511) | Sum of every output value in the transaction. +`{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_transaction_1ae4213b4c3e5e4ab28371604d9f0a53cb) | +`public inline `[`Transaction`](#class_bitprim_1_1_transaction_1ab20ffd365084f400febcf58a9f2b7111)`()` | Create an empty tramsaction. +`public inline `[`Transaction`](#class_bitprim_1_1_transaction_1abf686e7c063404e2ae28dc5e4b2bf5d4)`(UInt32 version,string hexString)` | Create a transaction from its binary hex representation. +`public inline `[`Transaction`](#class_bitprim_1_1_transaction_1afd4417823dd268d17b2c1ded794a0183)`(UInt32 version,UInt32 locktime,InputList inputs,OutputList outputs)` | Create a transaction from its version, locktime, inputs and outputs (all its data). +`public inline byte [] `[`GetHashBySigHashType`](#class_bitprim_1_1_transaction_1aa6278991258a52cd285eb6c4d6fe4582)`(UInt32 sigHashType)` | 32 bytes transaction hash + 4 bytes signature hash type +`public inline bool `[`IsDoubleSpend`](#class_bitprim_1_1_transaction_1a5397d59e47283d0e7c204810a98b6f4e)`(bool includeUnconfirmed)` | Returns true if at least one of the previous outputs was already spent, false otherwise. +`public inline bool `[`IsFinal`](#class_bitprim_1_1_transaction_1ad014d272c29cbd0c464a215d022c4601)`(UInt64 blockHeight,UInt32 blockTime)` | Returns true if and only if the transaction is final, false otherwise. +`public inline bool `[`IsImmature`](#class_bitprim_1_1_transaction_1a4edf429fbd5515110dbdc4e426e0af02)`(UInt64 targetHeight)` | Returns true if and only if at least one of the inputs is not mature, false otherwise. +`public inline byte [] `[`ToData`](#class_bitprim_1_1_transaction_1a67c3525ef1013453c1bc85902edb2fc7)`(bool wire)` | Raw transaction data. +`public inline UInt64 `[`GetSerializedSize`](#class_bitprim_1_1_transaction_1ad10eaadf7083d1cc1dec7f89a4c482af)`(bool wire)` | [Transaction](#class_bitprim_1_1_transaction) size in bytes. +`public inline UInt64 `[`GetSignatureOperationsBip16Active`](#class_bitprim_1_1_transaction_1aff789aa4471796ddff33b26617188de9)`(bool bip16Active)` | Amount of signature operations in the transactions. + +## Members + +#### `{property} bool `[`IsCoinbase`](#class_bitprim_1_1_transaction_1ae3a362e097393cbf8c8087107ac202e5) + +Returns true if and only if this is a coinbase transaction (i.e. generates new coins). + +#### `{property} bool `[`IsLocktimeConflict`](#class_bitprim_1_1_transaction_1ad7b30b6fa7c3ddea8e0ab1541810ae7f) + +Returns true if and only if the transaction is locked and every input is final, false otherwise. + +#### `{property} bool `[`IsMissingPreviousOutputs`](#class_bitprim_1_1_transaction_1af10e0b3b68b2a6d2dac82c67fa0c1e23) + +Returns true if and only if at least one of the previous outputs is invalid, false otherwise. + +#### `{property} bool `[`IsNullNonCoinbase`](#class_bitprim_1_1_transaction_1a49c7429cd339e138f983102fb530a96a) + +Return true if and only if the transaction is not coinbase and has a null previous output, false otherwise. + +#### `{property} bool `[`IsOversizeCoinbase`](#class_bitprim_1_1_transaction_1a7ebc78d891b9f5e4d01e0acb6a2214d5) + +Returns true if the transaction is coinbase and has an invalid script size on its first input. + +#### `{property} bool `[`IsOverspent`](#class_bitprim_1_1_transaction_1a5cccf30e1c82353fe678c393eb80df71) + +Returns true if transaction is not a coinbase, and the sum of its outputs is higher than the sum of its inputs, false otherwise. + +#### `{property} bool `[`IsValid`](#class_bitprim_1_1_transaction_1a29b8a68de9c1828a6b540f5dc02508da) + +Returns true if and only if this transaction is valid according to the protocol. + +#### `{property} byte [] `[`Hash`](#class_bitprim_1_1_transaction_1a54d13bfb55819222e4f302e1f8de063c) + +[Transaction](#class_bitprim_1_1_transaction) hash in 32 byte array format. + +#### `{property} InputList `[`Inputs`](#class_bitprim_1_1_transaction_1a33d098c55beee1bb9d7ff598ace272bc) + +A list with all the transaction inputs. + +#### `{property} OutputList `[`Outputs`](#class_bitprim_1_1_transaction_1a8f7202ac3b2839b02ea07197d88e0cfb) + +A list with all the transaction outputs. + +#### `{property} UInt32 `[`Locktime`](#class_bitprim_1_1_transaction_1a9049d57c642ab63763e906539db8f04a) + +[Transaction](#class_bitprim_1_1_transaction) locktime. + +#### `{property} UInt32 `[`Version`](#class_bitprim_1_1_transaction_1ae76b215e44e8e0a225dcca697b21002d) + +[Transaction](#class_bitprim_1_1_transaction) protocol version. + +#### `{property} UInt64 `[`Fees`](#class_bitprim_1_1_transaction_1a27c37d65dff9cae8fed5e6a684e641b7) + +Fees to pay to the winning miner. + +#### `{property} UInt64 `[`SignatureOperations`](#class_bitprim_1_1_transaction_1a9de1208d6409d511b3fa1b74d7020539) + +Amount of signature operations in the transaction. + +#### `{property} UInt64 `[`TotalInputValue`](#class_bitprim_1_1_transaction_1a291ada37f6535b154a7123ca3eb534ef) + +Sum of every input value in the transaction. + +#### `{property} UInt64 `[`TotalOutputValue`](#class_bitprim_1_1_transaction_1a48315105df2e9ddf66ded983200e0511) + +Sum of every output value in the transaction. + +#### `{property} IntPtr `[`NativeInstance`](#class_bitprim_1_1_transaction_1ae4213b4c3e5e4ab28371604d9f0a53cb) + +#### `public inline `[`Transaction`](#class_bitprim_1_1_transaction_1ab20ffd365084f400febcf58a9f2b7111)`()` + +Create an empty tramsaction. + +#### `public inline `[`Transaction`](#class_bitprim_1_1_transaction_1abf686e7c063404e2ae28dc5e4b2bf5d4)`(UInt32 version,string hexString)` + +Create a transaction from its binary hex representation. + +#### Parameters +* `version` [Transaction](#class_bitprim_1_1_transaction) protocol version. + +* `hexString` Raw transaction in hex + +#### `public inline `[`Transaction`](#class_bitprim_1_1_transaction_1afd4417823dd268d17b2c1ded794a0183)`(UInt32 version,UInt32 locktime,InputList inputs,OutputList outputs)` + +Create a transaction from its version, locktime, inputs and outputs (all its data). + +#### Parameters +* `version` [Transaction](#class_bitprim_1_1_transaction) protocol version. + +* `locktime` [Transaction](#class_bitprim_1_1_transaction) locktime. + +* `inputs` A list with all the transaction inputs. + +* `outputs` A list with all the transaction outputs. + +#### `public inline byte [] `[`GetHashBySigHashType`](#class_bitprim_1_1_transaction_1aa6278991258a52cd285eb6c4d6fe4582)`(UInt32 sigHashType)` + +32 bytes transaction hash + 4 bytes signature hash type + +#### Parameters +* `sigHashType` Sighash type. + +#### Returns +Hash and sighash type. + +#### `public inline bool `[`IsDoubleSpend`](#class_bitprim_1_1_transaction_1a5397d59e47283d0e7c204810a98b6f4e)`(bool includeUnconfirmed)` + +Returns true if at least one of the previous outputs was already spent, false otherwise. + +#### Parameters +* `includeUnconfirmed` Iif true, consider unconfirmed transactions. + +#### Returns +True if and only if transaction is double spend. + +#### `public inline bool `[`IsFinal`](#class_bitprim_1_1_transaction_1ad014d272c29cbd0c464a215d022c4601)`(UInt64 blockHeight,UInt32 blockTime)` + +Returns true if and only if the transaction is final, false otherwise. + +#### Parameters +* `blockHeight` +* `blockTime` + +#### Returns + +#### `public inline bool `[`IsImmature`](#class_bitprim_1_1_transaction_1a4edf429fbd5515110dbdc4e426e0af02)`(UInt64 targetHeight)` + +Returns true if and only if at least one of the inputs is not mature, false otherwise. + +#### Parameters +* `targetHeight` + +#### Returns + +#### `public inline byte [] `[`ToData`](#class_bitprim_1_1_transaction_1a67c3525ef1013453c1bc85902edb2fc7)`(bool wire)` + +Raw transaction data. + +#### Parameters +* `wire` Iif true, include data size at the beginning. + +#### Returns +Byte array with transaction data. + +#### `public inline UInt64 `[`GetSerializedSize`](#class_bitprim_1_1_transaction_1ad10eaadf7083d1cc1dec7f89a4c482af)`(bool wire)` + +[Transaction](#class_bitprim_1_1_transaction) size in bytes. + +#### Parameters +* `wire` If and only if true, size will include size of 'uint32' for storing spender output height + +#### Returns +Size in bytes. + +#### `public inline UInt64 `[`GetSignatureOperationsBip16Active`](#class_bitprim_1_1_transaction_1aff789aa4471796ddff33b26617188de9)`(bool bip16Active)` + +Amount of signature operations in the transactions. + +#### Parameters +* `bip16Active` True if and only if BIP16 is active, false otherwise. + +#### Returns + +# class `Bitprim::Validations` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- + +## Members + +# struct `Bitprim::GetTxPositionResult` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} UInt64 `[`Index`](#struct_bitprim_1_1_get_tx_position_result_1abf0a3a30f1926f1d5ca78805f807ccfb) | +`{property} UInt64 `[`BlockHeight`](#struct_bitprim_1_1_get_tx_position_result_1a52fbd7cf6e6cb4f5e706be3a6a379cc1) | + +## Members + +#### `{property} UInt64 `[`Index`](#struct_bitprim_1_1_get_tx_position_result_1abf0a3a30f1926f1d5ca78805f807ccfb) + +#### `{property} UInt64 `[`BlockHeight`](#struct_bitprim_1_1_get_tx_position_result_1a52fbd7cf6e6cb4f5e706be3a6a379cc1) + +# namespace `Bitprim::Logging` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`enum `[`LogLevel`](#namespace_bitprim_1_1_logging_1a89a90f71ddc112bc62c596aeb14d42a0) | The log level. +`public delegate bool `[`Logger`](#namespace_bitprim_1_1_logging_1a87f15f0754f0a1275273f4caff520307)`(`[`LogLevel`](#namespace_bitprim_1_1_logging_1a89a90f71ddc112bc62c596aeb14d42a0)` logLevel,Func< string > messageFunc,Exception exception,params object [] formatParameters)` | +`class `[`Bitprim::Logging::LogExtensions`](#class_bitprim_1_1_logging_1_1_log_extensions) | +`class `[`Bitprim::Logging::LoggerExecutionWrapper`](#class_bitprim_1_1_logging_1_1_logger_execution_wrapper) | +`class `[`Bitprim::Logging::LogProvider`](#class_bitprim_1_1_logging_1_1_log_provider) | Provides a mechanism to create instances of ILog objects. + +## Members + +#### `enum `[`LogLevel`](#namespace_bitprim_1_1_logging_1a89a90f71ddc112bc62c596aeb14d42a0) + + Values | Descriptions +--------------------------------|--------------------------------------------- +Trace | +Debug | +Info | +Warn | +Error | +Fatal | + +The log level. + +#### `public delegate bool `[`Logger`](#namespace_bitprim_1_1_logging_1a87f15f0754f0a1275273f4caff520307)`(`[`LogLevel`](#namespace_bitprim_1_1_logging_1a89a90f71ddc112bc62c596aeb14d42a0)` logLevel,Func< string > messageFunc,Exception exception,params object [] formatParameters)` + +# class `Bitprim::Logging::LogExtensions` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- + +## Members + +# class `Bitprim::Logging::LoggerExecutionWrapper` + +``` +class Bitprim::Logging::LoggerExecutionWrapper + : public Bitprim.Logging.ILog +``` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public inline bool `[`Log`](#class_bitprim_1_1_logging_1_1_logger_execution_wrapper_1a0b2e71f3abfbc89712dc665c303f4499)`(`[`LogLevel`](#namespace_bitprim_1_1_logging_1a89a90f71ddc112bc62c596aeb14d42a0)` logLevel,Func< string > messageFunc,Exception exception,params object [] formatParameters)` | + +## Members + +#### `public inline bool `[`Log`](#class_bitprim_1_1_logging_1_1_logger_execution_wrapper_1a0b2e71f3abfbc89712dc665c303f4499)`(`[`LogLevel`](#namespace_bitprim_1_1_logging_1a89a90f71ddc112bc62c596aeb14d42a0)` logLevel,Func< string > messageFunc,Exception exception,params object [] formatParameters)` + +# class `Bitprim::Logging::LogProvider` + +Provides a mechanism to create instances of ILog objects. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`IsDisabled`](#class_bitprim_1_1_logging_1_1_log_provider_1a8f9e9127793e0e036e4b54c590f3aa02) | Gets or sets a value indicating whether this is logging is disabled. +`{property} Action< `[`ILogProvider`](#interface_bitprim_1_1_logging_1_1_i_log_provider)` > `[`OnCurrentLogProviderSet`](#class_bitprim_1_1_logging_1_1_log_provider_1abb503a9dc6980810e845968c7dd3e6ac) | Sets an action that is invoked when a consumer of your library has called SetCurrentLogProvider. It is important that hook into this if you are using child libraries (especially ilmerged ones) that are using LibLog (or other logging abstraction) so you adapt and delegate to them. SetCurrentLogProvider + +## Members + +#### `{property} bool `[`IsDisabled`](#class_bitprim_1_1_logging_1_1_log_provider_1a8f9e9127793e0e036e4b54c590f3aa02) + +Gets or sets a value indicating whether this is logging is disabled. + +`true` if logging is disabled; otherwise, `false`. + +#### `{property} Action< `[`ILogProvider`](#interface_bitprim_1_1_logging_1_1_i_log_provider)` > `[`OnCurrentLogProviderSet`](#class_bitprim_1_1_logging_1_1_log_provider_1abb503a9dc6980810e845968c7dd3e6ac) + +Sets an action that is invoked when a consumer of your library has called SetCurrentLogProvider. It is important that hook into this if you are using child libraries (especially ilmerged ones) that are using LibLog (or other logging abstraction) so you adapt and delegate to them. SetCurrentLogProvider + +# namespace `Bitprim::Logging::LogProviders` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`class `[`Bitprim::Logging::LogProviders::DisposableAction`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_disposable_action) | +`class `[`Bitprim::Logging::LogProviders::Log4NetLogProvider`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log4_net_log_provider) | +`class `[`Bitprim::Logging::LogProviders::LogMessageFormatter`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_message_formatter) | +`class `[`Bitprim::Logging::LogProviders::LogProviderBase`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base) | +`class `[`Bitprim::Logging::LogProviders::LoupeLogProvider`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_loupe_log_provider) | +`class `[`Bitprim::Logging::LogProviders::NLogLogProvider`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_n_log_log_provider) | +`class `[`Bitprim::Logging::LogProviders::SerilogLogProvider`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_serilog_log_provider) | +`class `[`Bitprim::Logging::LogProviders::TraceEventTypeValues`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_trace_event_type_values) | +`class `[`Bitprim::Logging::LogProviders::TypeExtensions`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_type_extensions) | + +# class `Bitprim::Logging::LogProviders::DisposableAction` + +``` +class Bitprim::Logging::LogProviders::DisposableAction + : public IDisposable +``` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public `[`DisposableAction`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_disposable_action_1a0cb08e5ff6f32f072c09875bfa375ce0)`(Action onDispose)` | + +## Members + +#### `public `[`DisposableAction`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_disposable_action_1a0cb08e5ff6f32f072c09875bfa375ce0)`(Action onDispose)` + +# class `Bitprim::Logging::LogProviders::Log4NetLogProvider` + +``` +class Bitprim::Logging::LogProviders::Log4NetLogProvider + : public Bitprim.Logging.LogProviders.LogProviderBase +``` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`ProviderIsAvailableOverride`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log4_net_log_provider_1aa458d2a476f77b6fb6d532c4a87d0c27) | +`public inline `[`Log4NetLogProvider`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log4_net_log_provider_1aca8cffb0f4e1da0ad92125372dd5a2fd)`()` | +`public override Logger `[`GetLogger`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log4_net_log_provider_1a50249194a29487e2e742815117973a69)`(string name)` | +`protected inline override OpenNdc `[`GetOpenNdcMethod`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log4_net_log_provider_1a2dc9fde760ec81288f6cd9c01bc0ee33)`()` | +`protected inline override OpenMdc `[`GetOpenMdcMethod`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log4_net_log_provider_1a5ea5b2d9325107a7e2cc716b541372da)`()` | + +## Members + +#### `{property} bool `[`ProviderIsAvailableOverride`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log4_net_log_provider_1aa458d2a476f77b6fb6d532c4a87d0c27) + +#### `public inline `[`Log4NetLogProvider`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log4_net_log_provider_1aca8cffb0f4e1da0ad92125372dd5a2fd)`()` + +#### `public override Logger `[`GetLogger`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log4_net_log_provider_1a50249194a29487e2e742815117973a69)`(string name)` + +#### `protected inline override OpenNdc `[`GetOpenNdcMethod`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log4_net_log_provider_1a2dc9fde760ec81288f6cd9c01bc0ee33)`()` + +#### `protected inline override OpenMdc `[`GetOpenMdcMethod`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log4_net_log_provider_1a5ea5b2d9325107a7e2cc716b541372da)`()` + +# class `Bitprim::Logging::LogProviders::LogMessageFormatter` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- + +## Members + +# class `Bitprim::Logging::LogProviders::LogProviderBase` + +``` +class Bitprim::Logging::LogProviders::LogProviderBase + : public Bitprim.Logging.ILogProvider +``` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public abstract Logger `[`GetLogger`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base_1a54c03de723dde7ab216559577bd616c2)`(string name)` | +`public IDisposable `[`OpenNestedContext`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base_1a703cb2b34b4e1c174fd4f44021f92276)`(string message)` | +`public IDisposable `[`OpenMappedContext`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base_1a880f73a34ab257553907729284d00961)`(string key,object value,bool destructure)` | +`protected delegate IDisposable `[`OpenNdc`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base_1a77ae5122ca397e98a55fd09c6a53793f)`(string message)` | +`protected delegate IDisposable `[`OpenMdc`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base_1a34c42e08bc3d9734b71544d97bd604a9)`(string key,object value,bool destructure)` | +`protected inline `[`LogProviderBase`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base_1a7260f77fe92b7609581ac905a441d228)`()` | +`protected virtual OpenNdc `[`GetOpenNdcMethod`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base_1ac036d5f314ac108e86a94cd59f8b61ea)`()` | +`protected virtual OpenMdc `[`GetOpenMdcMethod`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base_1aca9325f22a202a0c3786f5fd89e35be7)`()` | + +## Members + +#### `public abstract Logger `[`GetLogger`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base_1a54c03de723dde7ab216559577bd616c2)`(string name)` + +#### `public IDisposable `[`OpenNestedContext`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base_1a703cb2b34b4e1c174fd4f44021f92276)`(string message)` + +#### `public IDisposable `[`OpenMappedContext`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base_1a880f73a34ab257553907729284d00961)`(string key,object value,bool destructure)` + +#### `protected delegate IDisposable `[`OpenNdc`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base_1a77ae5122ca397e98a55fd09c6a53793f)`(string message)` + +#### `protected delegate IDisposable `[`OpenMdc`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base_1a34c42e08bc3d9734b71544d97bd604a9)`(string key,object value,bool destructure)` + +#### `protected inline `[`LogProviderBase`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base_1a7260f77fe92b7609581ac905a441d228)`()` + +#### `protected virtual OpenNdc `[`GetOpenNdcMethod`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base_1ac036d5f314ac108e86a94cd59f8b61ea)`()` + +#### `protected virtual OpenMdc `[`GetOpenMdcMethod`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log_provider_base_1aca9325f22a202a0c3786f5fd89e35be7)`()` + +# class `Bitprim::Logging::LogProviders::LoupeLogProvider` + +``` +class Bitprim::Logging::LogProviders::LoupeLogProvider + : public Bitprim.Logging.LogProviders.LogProviderBase +``` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`ProviderIsAvailableOverride`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_loupe_log_provider_1a63ff65b7c9de0c68d8312a07f1bb06ff) | Gets or sets a value indicating whether [provider is available override]. Used in tests. +`public inline `[`LoupeLogProvider`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_loupe_log_provider_1a3e3ce702a91a2ca75debb45998c83fa0)`()` | +`public override Logger `[`GetLogger`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_loupe_log_provider_1a8a7f8d51aa46620e00123299660d046c)`(string name)` | + +## Members + +#### `{property} bool `[`ProviderIsAvailableOverride`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_loupe_log_provider_1a63ff65b7c9de0c68d8312a07f1bb06ff) + +Gets or sets a value indicating whether [provider is available override]. Used in tests. + +`true` if [provider is available override]; otherwise, `false`. + +#### `public inline `[`LoupeLogProvider`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_loupe_log_provider_1a3e3ce702a91a2ca75debb45998c83fa0)`()` + +#### `public override Logger `[`GetLogger`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_loupe_log_provider_1a8a7f8d51aa46620e00123299660d046c)`(string name)` + +# class `Bitprim::Logging::LogProviders::NLogLogProvider` + +``` +class Bitprim::Logging::LogProviders::NLogLogProvider + : public Bitprim.Logging.LogProviders.LogProviderBase +``` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`ProviderIsAvailableOverride`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_n_log_log_provider_1ac063ccdf79f8f39276748bd4d930e8d0) | +`public inline `[`NLogLogProvider`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_n_log_log_provider_1a93ac90dfcc094ae42b35b7e963bd2fc7)`()` | +`public override Logger `[`GetLogger`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_n_log_log_provider_1af2114403f160959501ba353a684b628a)`(string name)` | +`protected inline override OpenNdc `[`GetOpenNdcMethod`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_n_log_log_provider_1a2de35597cae00eec9bf6ebdc9f50febe)`()` | +`protected inline override OpenMdc `[`GetOpenMdcMethod`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_n_log_log_provider_1a216c686b33156c4ac9e76e53dec346ee)`()` | + +## Members + +#### `{property} bool `[`ProviderIsAvailableOverride`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_n_log_log_provider_1ac063ccdf79f8f39276748bd4d930e8d0) + +#### `public inline `[`NLogLogProvider`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_n_log_log_provider_1a93ac90dfcc094ae42b35b7e963bd2fc7)`()` + +#### `public override Logger `[`GetLogger`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_n_log_log_provider_1af2114403f160959501ba353a684b628a)`(string name)` + +#### `protected inline override OpenNdc `[`GetOpenNdcMethod`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_n_log_log_provider_1a2de35597cae00eec9bf6ebdc9f50febe)`()` + +#### `protected inline override OpenMdc `[`GetOpenMdcMethod`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_n_log_log_provider_1a216c686b33156c4ac9e76e53dec346ee)`()` + +# class `Bitprim::Logging::LogProviders::SerilogLogProvider` + +``` +class Bitprim::Logging::LogProviders::SerilogLogProvider + : public Bitprim.Logging.LogProviders.LogProviderBase +``` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`{property} bool `[`ProviderIsAvailableOverride`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_serilog_log_provider_1a825f601a067b4bd285b183d943da8a4c) | +`public inline `[`SerilogLogProvider`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_serilog_log_provider_1ad57e5f1c761277bc013a40ed0f507085)`()` | +`public override Logger `[`GetLogger`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_serilog_log_provider_1adbe0c0f7a6dfed7e1d4f08335ab36bb8)`(string name)` | +`protected override OpenNdc `[`GetOpenNdcMethod`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_serilog_log_provider_1acd484c6e37b677b2f0362ed2451e1181)`()` | +`protected override OpenMdc `[`GetOpenMdcMethod`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_serilog_log_provider_1a6134cfb88fa2f26a89b4651721f2f9c8)`()` | + +## Members + +#### `{property} bool `[`ProviderIsAvailableOverride`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_serilog_log_provider_1a825f601a067b4bd285b183d943da8a4c) + +#### `public inline `[`SerilogLogProvider`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_serilog_log_provider_1ad57e5f1c761277bc013a40ed0f507085)`()` + +#### `public override Logger `[`GetLogger`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_serilog_log_provider_1adbe0c0f7a6dfed7e1d4f08335ab36bb8)`(string name)` + +#### `protected override OpenNdc `[`GetOpenNdcMethod`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_serilog_log_provider_1acd484c6e37b677b2f0362ed2451e1181)`()` + +#### `protected override OpenMdc `[`GetOpenMdcMethod`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_serilog_log_provider_1a6134cfb88fa2f26a89b4651721f2f9c8)`()` + +# class `Bitprim::Logging::LogProviders::TraceEventTypeValues` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- + +## Members + +# class `Bitprim::Logging::LogProviders::TypeExtensions` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- + +## Members + +# class `Bitprim::Logging::LoggerExecutionWrapper::CallSiteExtension` + +``` +class Bitprim::Logging::LoggerExecutionWrapper::CallSiteExtension + : public Bitprim.Logging.LoggerExecutionWrapper.ICallSiteExtension +``` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- + +## Members + +# class `Constants` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- + +## Members + +# class `Bitprim::Logging::LogProviders::Log4NetLogProvider::Log4NetLogger` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public inline bool `[`Log`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log4_net_log_provider_1_1_log4_net_logger_1ab64407ffab569fd99e360ae012d27ee4)`(`[`LogLevel`](#namespace_bitprim_1_1_logging_1a89a90f71ddc112bc62c596aeb14d42a0)` logLevel,Func< string > messageFunc,Exception exception,params object [] formatParameters)` | + +## Members + +#### `public inline bool `[`Log`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_log4_net_log_provider_1_1_log4_net_logger_1ab64407ffab569fd99e360ae012d27ee4)`(`[`LogLevel`](#namespace_bitprim_1_1_logging_1a89a90f71ddc112bc62c596aeb14d42a0)` logLevel,Func< string > messageFunc,Exception exception,params object [] formatParameters)` + +# class `Bitprim::Logging::LogProviders::LoupeLogProvider::LoupeLogger` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public inline bool `[`Log`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_loupe_log_provider_1_1_loupe_logger_1a7430036e2428619f354edbff2e10552b)`(`[`LogLevel`](#namespace_bitprim_1_1_logging_1a89a90f71ddc112bc62c596aeb14d42a0)` logLevel,Func< string > messageFunc,Exception exception,params object [] formatParameters)` | + +## Members + +#### `public inline bool `[`Log`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_loupe_log_provider_1_1_loupe_logger_1a7430036e2428619f354edbff2e10552b)`(`[`LogLevel`](#namespace_bitprim_1_1_logging_1a89a90f71ddc112bc62c596aeb14d42a0)` logLevel,Func< string > messageFunc,Exception exception,params object [] formatParameters)` + +# class `Bitprim::Logging::LogProviders::NLogLogProvider::NLogLogger` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public inline bool `[`Log`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_n_log_log_provider_1_1_n_log_logger_1a5bcaa10d1fa4fe93d68e297a8e3132a6)`(`[`LogLevel`](#namespace_bitprim_1_1_logging_1a89a90f71ddc112bc62c596aeb14d42a0)` logLevel,Func< string > messageFunc,Exception exception,params object [] formatParameters)` | + +## Members + +#### `public inline bool `[`Log`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_n_log_log_provider_1_1_n_log_logger_1a5bcaa10d1fa4fe93d68e297a8e3132a6)`(`[`LogLevel`](#namespace_bitprim_1_1_logging_1a89a90f71ddc112bc62c596aeb14d42a0)` logLevel,Func< string > messageFunc,Exception exception,params object [] formatParameters)` + +# class `Bitprim::Logging::LogProvider::NoOpLogger` + +``` +class Bitprim::Logging::LogProvider::NoOpLogger + : public Bitprim.Logging.ILog +``` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public inline bool `[`Log`](#class_bitprim_1_1_logging_1_1_log_provider_1_1_no_op_logger_1af9f2b6a1bb4da4922d5d46992cb3feee)`(`[`LogLevel`](#namespace_bitprim_1_1_logging_1a89a90f71ddc112bc62c596aeb14d42a0)` logLevel,Func< string > messageFunc,Exception exception,params object [] formatParameters)` | + +## Members + +#### `public inline bool `[`Log`](#class_bitprim_1_1_logging_1_1_log_provider_1_1_no_op_logger_1af9f2b6a1bb4da4922d5d46992cb3feee)`(`[`LogLevel`](#namespace_bitprim_1_1_logging_1a89a90f71ddc112bc62c596aeb14d42a0)` logLevel,Func< string > messageFunc,Exception exception,params object [] formatParameters)` + +# class `Bitprim::Logging::LogProviders::SerilogLogProvider::SerilogLogger` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public inline bool `[`Log`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_serilog_log_provider_1_1_serilog_logger_1afa133fc2dabc0cccdd32ef0c7df2ab11)`(`[`LogLevel`](#namespace_bitprim_1_1_logging_1a89a90f71ddc112bc62c596aeb14d42a0)` logLevel,Func< string > messageFunc,Exception exception,params object [] formatParameters)` | + +## Members + +#### `public inline bool `[`Log`](#class_bitprim_1_1_logging_1_1_log_providers_1_1_serilog_log_provider_1_1_serilog_logger_1afa133fc2dabc0cccdd32ef0c7df2ab11)`(`[`LogLevel`](#namespace_bitprim_1_1_logging_1a89a90f71ddc112bc62c596aeb14d42a0)` logLevel,Func< string > messageFunc,Exception exception,params object [] formatParameters)` + +Generated by [Moxygen](https://sourcey.com/moxygen) \ No newline at end of file diff --git a/docs/developer_guide/go/Go-interface.md b/docs/developer_guide/go/Go-interface.md new file mode 100644 index 0000000..f36d486 --- /dev/null +++ b/docs/developer_guide/go/Go-interface.md @@ -0,0 +1,25 @@ +Bitprim's Go interface is built on top of Bitprim's C interface, in this fashion: + +![](assets/binding_go.png) + +On top of the raw C interface, a 1-1 binding is made in Go, in order to separate access to the API from its usage; this avoids impedance mismatch by separating the marshalling aspects from the binding language idiosyncrasies. That is, the 1-1 interface takes care of marshalling, without changing the interface. Then, the idiomatic interface uses the higher level language tools and idioms in order to hide the complexity from the application programmer. + +It takes another programmer profile in order to tinker with the lower level interfaces or consume them directly, but that is also possible when working with this approach: 3 separate levels of abstraction for accessing the same functionality. + +## Basic structure + +--- + +See [the source in Github](https://github.com/bitprim/bitprim-go/tree/master/bitprim): + +* {entity}\_native.go: All of these together implement the 1-1 native interface. As usual, executor is the main entity which is used for manipulating the node. +* {entity}.go: Together, all of these comprise the idiomatic interface. They define user defined types using the Go conventions that Go application programmers are familiar with and expect from a Go library/binding. + +## RESTful interface + +--- + +One characteristic that sets Go apart from, say, Python, is the ease with which a REST API can be created and tested from scratch. This is a very useful feature in today's web-centric world, and in order to make things even easier for Go developers, a REST api is also offered in this interface. See [here](https://github.com/bitprim/bitprim-go/tree/master/rest-api) for an example of how to start an http server which hosts it and can be consumed from Postman, Curl or a browser and thus easily integrated into any web application. + + + diff --git a/docs/developer_guide/go/assets/binding_go.png b/docs/developer_guide/go/assets/binding_go.png new file mode 100644 index 0000000000000000000000000000000000000000..f58157590b0efcd4ec6a0177f7604c99eae9a9bf GIT binary patch literal 21818 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 literal 0 HcmV?d00001 diff --git a/docs/developer_guide/introduction.md b/docs/developer_guide/introduction.md new file mode 100644 index 0000000..0eaf28e --- /dev/null +++ b/docs/developer_guide/introduction.md @@ -0,0 +1,12 @@ +## Introduction + +*Bitprim* works as a cryptocurrency development platform with several programmable APIs: + +* C++ +* C +* C# +* Python +* Javascript +* Rust +* Golang + diff --git a/docs/developer_guide/python/Python-interface-details.md b/docs/developer_guide/python/Python-interface-details.md new file mode 100644 index 0000000..23a470b --- /dev/null +++ b/docs/developer_guide/python/Python-interface-details.md @@ -0,0 +1,1337 @@ +# Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`namespace `[`bitprim`](#namespacebitprim) | + +# namespace `bitprim` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`encode_hash`](#bitprim_8py_1a0592acb88150dfcb800e7fa1975cf8ce)`(hash)` | str: Converts a bytearray into a readable format. +`public def `[`decode_hash`](#bitprim_8py_1ae9d85d5c0bd672672fc12eb12144c092)`(hash_str)` | bytearray: Converts a string into a workable format. +`class `[`bitprim::Binary`](#classbitprim_1_1Binary) | Represents a binary filter. +`class `[`bitprim::Block`](#classbitprim_1_1Block) | Represent a full Bitcoin block. +`class `[`bitprim::BlockList`](#classbitprim_1_1BlockList) | +`class `[`bitprim::Chain`](#classbitprim_1_1Chain) | Represents the Bitcoin blockchain. +`class `[`bitprim::Executor`](#classbitprim_1_1Executor) | Controls the execution of the Bitprim bitcoin node. +`class `[`bitprim::Header`](#classbitprim_1_1Header) | Represent the Header of a Bitcoin Block. +`class `[`bitprim::History`](#classbitprim_1_1History) | Output points, values, and spends for a payment address +`class `[`bitprim::HistoryList`](#classbitprim_1_1HistoryList) | +`class `[`bitprim::Input`](#classbitprim_1_1Input) | Represents one of the inputs of a Transaction. +`class `[`bitprim::InputList`](#classbitprim_1_1InputList) | +`class `[`bitprim::MerkleBlock`](#classbitprim_1_1MerkleBlock) | +`class `[`bitprim::Output`](#classbitprim_1_1Output) | Represents one of the outputs of a Transaction. +`class `[`bitprim::OutputList`](#classbitprim_1_1OutputList) | +`class `[`bitprim::OutputPoint`](#classbitprim_1_1OutputPoint) | Transaction hash and index representing one of the transaction outputs. +`class `[`bitprim::PaymentAddress`](#classbitprim_1_1PaymentAddress) | Represents a Bitcoin wallet address. +`class `[`bitprim::Point`](#classbitprim_1_1Point) | Represents one of the txs input. +`class `[`bitprim::Script`](#classbitprim_1_1Script) | Represents transaction scripts. +`class `[`bitprim::Stealth`](#classbitprim_1_1Stealth) | +`class `[`bitprim::StealthCompact`](#classbitprim_1_1StealthCompact) | +`class `[`bitprim::StealthCompactList`](#classbitprim_1_1StealthCompactList) | +`class `[`bitprim::StealthList`](#classbitprim_1_1StealthList) | +`class `[`bitprim::Transaction`](#classbitprim_1_1Transaction) | Represents a Bitcoin Transaction. +`class `[`bitprim::TransactionList`](#classbitprim_1_1TransactionList) | +`class `[`bitprim::Wallet`](#classbitprim_1_1Wallet) | + +## Members + +#### `public def `[`encode_hash`](#bitprim_8py_1a0592acb88150dfcb800e7fa1975cf8ce)`(hash)` + +str: Converts a bytearray into a readable format. +example return: "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f" + +Args: + hash (bytearray): bytes of the hash. + +#### `public def `[`decode_hash`](#bitprim_8py_1ae9d85d5c0bd672672fc12eb12144c092)`(hash_str)` + +bytearray: Converts a string into a workable format. + +Args: + hash_str (str): string with hash. example "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f" + +# class `bitprim::Binary` + +Represents a binary filter. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1Binary_1a1daf6fc8346857c44134d1b162888e00)`(self,ptr)` | +`public def `[`construct`](#classbitprim_1_1Binary_1a248318057ecc3f432d2f3d4514ee7018)`(self)` | Binary: create an empty binary object. +`public def `[`construct_string`](#classbitprim_1_1Binary_1af6393c61459c6e883bd103ffa30ce765)`(self,string_filter)` | Binary: construct a binary filter form string. +`public def `[`construct_blocks`](#classbitprim_1_1Binary_1a74fbcd4afc9837b23ef1a91ea2a7589c)`(self,size,`[`blocks`](#classbitprim_1_1Binary_1a59e18ba201b98aeb46acff7cdeddadb8)`)` | Binary: construct binary filter from an array of int. +`public def `[`blocks`](#classbitprim_1_1Binary_1a59e18ba201b98aeb46acff7cdeddadb8)`(self)` | Array [unsigned int]: returns the filter as an array of uint. +`public def `[`encoded`](#classbitprim_1_1Binary_1a357615d3078c30ad799f6a4f057a8d0d)`(self)` | str: returns the filter in a binary string. + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1Binary_1a1daf6fc8346857c44134d1b162888e00)`(self,ptr)` + +#### `public def `[`construct`](#classbitprim_1_1Binary_1a248318057ecc3f432d2f3d4514ee7018)`(self)` + +Binary: create an empty binary object. + +#### `public def `[`construct_string`](#classbitprim_1_1Binary_1af6393c61459c6e883bd103ffa30ce765)`(self,string_filter)` + +Binary: construct a binary filter form string. + +Args: + string_filter (str): binary string. Example: '10111010101011011111000000001101' + +#### `public def `[`construct_blocks`](#classbitprim_1_1Binary_1a74fbcd4afc9837b23ef1a91ea2a7589c)`(self,size,`[`blocks`](#classbitprim_1_1Binary_1a59e18ba201b98aeb46acff7cdeddadb8)`)` + +Binary: construct binary filter from an array of int. + +Args: + size (unsigned int): lenght of the filter. + blocks (array[unsigned int]): Every int represents a byte of the filter. Example: '[186,173,240,13]' + +#### `public def `[`blocks`](#classbitprim_1_1Binary_1a59e18ba201b98aeb46acff7cdeddadb8)`(self)` + +Array [unsigned int]: returns the filter as an array of uint. + +#### `public def `[`encoded`](#classbitprim_1_1Binary_1a357615d3078c30ad799f6a4f057a8d0d)`(self)` + +str: returns the filter in a binary string. + +# class `bitprim::Block` + +Represent a full Bitcoin block. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1Block_1a44545a7845b4018443876653dfec399b)`(self,pointer,`[`height`](#classbitprim_1_1Block_1a7d8e2c22055d9d5247969f709d2b574b)`)` | +`public def `[`__del__`](#classbitprim_1_1Block_1abe0b5010b709246f4c6782994e9425c8)`(self)` | +`public def `[`height`](#classbitprim_1_1Block_1a7d8e2c22055d9d5247969f709d2b574b)`(self)` | unsigned int: Height of the block in the chain. +`public def `[`header`](#classbitprim_1_1Block_1afcfdf6c352e1e7050d28c3feab1e1ac2)`(self)` | Header: block header object. +`public def `[`transaction_count`](#classbitprim_1_1Block_1af3d919e7ed870a65fd5478c2a9429e01)`(self)` | unsigned int: amount of transaction in the block. +`public def `[`hash`](#classbitprim_1_1Block_1abb559d43d05b2c1348cb1ead5c9cda41)`(self)` | bytearray: 32 bytes of the block hash. +`public def `[`serialized_size`](#classbitprim_1_1Block_1ab3436c618568d6e09084fa4e9523671f)`(self)` | unsigned int: size of the block in bytes. +`public def `[`fees`](#classbitprim_1_1Block_1a1ef7f0aa734ec9e299e24f7fffc0808e)`(self)` | unsigned int: amount of fees included in coinbase. +`public def `[`claim`](#classbitprim_1_1Block_1a907b7a24b60a5c02de03a24f4b3044b3)`(self)` | unsigned int: value of the outputs in the coinbase. +`public def `[`reward`](#classbitprim_1_1Block_1a1d018419f3b6159090f411edac2a509f)`(self,`[`height`](#classbitprim_1_1Block_1a7d8e2c22055d9d5247969f709d2b574b)`)` | unsigned int: value of the fees plus the reward for a block at the given height. +`public def `[`generate_merkle_root`](#classbitprim_1_1Block_1ac0f6c0124f4783ffc9e35c4a845551a4)`(self)` | bytearray: 32 bytes of the merkle root, for the generated merkle tree. +`public def `[`is_valid`](#classbitprim_1_1Block_1ab89a94a544e21b2ba10090bcd134d0f4)`(self)` | int: block has transactions and a valid Header. 1 if its valid. +`public def `[`transaction_nth`](#classbitprim_1_1Block_1a5667be645fb35e99672f6edd4eb79f71)`(self,n)` | Transaction: given a position in the block, returns the corresponding transaction. +`public def `[`signature_operations`](#classbitprim_1_1Block_1ab7e7eb80570a7e1592260ace29b8172f)`(self)` | unsigned int: amount of signature operations in the block. +`public def `[`signature_operations_bip16_active`](#classbitprim_1_1Block_1a529bf227db8e885caedfb01ba96b30f4)`(self,bip16_active)` | unsigned int: amount of signature operations in the block. +`public def `[`total_inputs`](#classbitprim_1_1Block_1aecf9d6861b5804bf4e8a531da92e5469)`(self,with_coinbase)` | unsigned int: amount of inputs in every transaction in the block. +`public def `[`is_extra_coinbases`](#classbitprim_1_1Block_1a9ae78d94a280b7d2f6d4e61378e148b9)`(self)` | int: returns '1' if there is another coinbase other than the first transaction. +`public def `[`is_final`](#classbitprim_1_1Block_1acbeaad19916285fcb598284e0560bc99)`(self,`[`height`](#classbitprim_1_1Block_1a7d8e2c22055d9d5247969f709d2b574b)`)` | int: returns '1' if every transaction in the block is final. +`public def `[`is_distinct_transaction_set`](#classbitprim_1_1Block_1a2f858494ee1ddb0f455efc2289422f22)`(self)` | int: returns '1' if there are not two transactions with the same hash. +`public def `[`is_valid_coinbase_claim`](#classbitprim_1_1Block_1a5e844d3b70bc66bcac3cf4108d9a4c14)`(self,`[`height`](#classbitprim_1_1Block_1a7d8e2c22055d9d5247969f709d2b574b)`)` | int: returns '1' if coinbase claim is not higher than the deserved reward. +`public def `[`is_valid_coinbase_script`](#classbitprim_1_1Block_1a0b1d70c44c0f94090f5f3dc2b2730fc2)`(self,`[`height`](#classbitprim_1_1Block_1a7d8e2c22055d9d5247969f709d2b574b)`)` | int: returns '1' if coinbase script is valid. +`public def `[`is_valid_merkle_root`](#classbitprim_1_1Block_1a53e999a14dc396d90606155c384a9848)`(self)` | int: returns '1' if the generated merkle root is equal to the Header merkle root. + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1Block_1a44545a7845b4018443876653dfec399b)`(self,pointer,`[`height`](#classbitprim_1_1Block_1a7d8e2c22055d9d5247969f709d2b574b)`)` + +#### `public def `[`__del__`](#classbitprim_1_1Block_1abe0b5010b709246f4c6782994e9425c8)`(self)` + +#### `public def `[`height`](#classbitprim_1_1Block_1a7d8e2c22055d9d5247969f709d2b574b)`(self)` + +unsigned int: Height of the block in the chain. + +#### `public def `[`header`](#classbitprim_1_1Block_1afcfdf6c352e1e7050d28c3feab1e1ac2)`(self)` + +Header: block header object. + +#### `public def `[`transaction_count`](#classbitprim_1_1Block_1af3d919e7ed870a65fd5478c2a9429e01)`(self)` + +unsigned int: amount of transaction in the block. + +#### `public def `[`hash`](#classbitprim_1_1Block_1abb559d43d05b2c1348cb1ead5c9cda41)`(self)` + +bytearray: 32 bytes of the block hash. + +#### `public def `[`serialized_size`](#classbitprim_1_1Block_1ab3436c618568d6e09084fa4e9523671f)`(self)` + +unsigned int: size of the block in bytes. + +#### `public def `[`fees`](#classbitprim_1_1Block_1a1ef7f0aa734ec9e299e24f7fffc0808e)`(self)` + +unsigned int: amount of fees included in coinbase. + +#### `public def `[`claim`](#classbitprim_1_1Block_1a907b7a24b60a5c02de03a24f4b3044b3)`(self)` + +unsigned int: value of the outputs in the coinbase. + +#### `public def `[`reward`](#classbitprim_1_1Block_1a1d018419f3b6159090f411edac2a509f)`(self,`[`height`](#classbitprim_1_1Block_1a7d8e2c22055d9d5247969f709d2b574b)`)` + +unsigned int: value of the fees plus the reward for a block at the given height. + +Args: + height (unsigned int): height of the block in the chain. + +#### `public def `[`generate_merkle_root`](#classbitprim_1_1Block_1ac0f6c0124f4783ffc9e35c4a845551a4)`(self)` + +bytearray: 32 bytes of the merkle root, for the generated merkle tree. + +#### `public def `[`is_valid`](#classbitprim_1_1Block_1ab89a94a544e21b2ba10090bcd134d0f4)`(self)` + +int: block has transactions and a valid Header. 1 if its valid. + +#### `public def `[`transaction_nth`](#classbitprim_1_1Block_1a5667be645fb35e99672f6edd4eb79f71)`(self,n)` + +Transaction: given a position in the block, returns the corresponding transaction. + +Args: + n (unsigned int): index of the transaction in the block. + +#### `public def `[`signature_operations`](#classbitprim_1_1Block_1ab7e7eb80570a7e1592260ace29b8172f)`(self)` + +unsigned int: amount of signature operations in the block. +Returns max_int in case of overflow. + +#### `public def `[`signature_operations_bip16_active`](#classbitprim_1_1Block_1a529bf227db8e885caedfb01ba96b30f4)`(self,bip16_active)` + +unsigned int: amount of signature operations in the block. +Returns max_int in case of overflow. + +Args: + bip16_active(int): if bip16 is activated at this point. Should be '1' if its active. + +#### `public def `[`total_inputs`](#classbitprim_1_1Block_1aecf9d6861b5804bf4e8a531da92e5469)`(self,with_coinbase)` + +unsigned int: amount of inputs in every transaction in the block. + +Args: + with_coinbase (int): should be '1' if block contains a coinbase transaction. '0' otherwise. + +#### `public def `[`is_extra_coinbases`](#classbitprim_1_1Block_1a9ae78d94a280b7d2f6d4e61378e148b9)`(self)` + +int: returns '1' if there is another coinbase other than the first transaction. + +#### `public def `[`is_final`](#classbitprim_1_1Block_1acbeaad19916285fcb598284e0560bc99)`(self,`[`height`](#classbitprim_1_1Block_1a7d8e2c22055d9d5247969f709d2b574b)`)` + +int: returns '1' if every transaction in the block is final. + +Args: + height (unsigned int): height of the block in the chain. + +#### `public def `[`is_distinct_transaction_set`](#classbitprim_1_1Block_1a2f858494ee1ddb0f455efc2289422f22)`(self)` + +int: returns '1' if there are not two transactions with the same hash. + +#### `public def `[`is_valid_coinbase_claim`](#classbitprim_1_1Block_1a5e844d3b70bc66bcac3cf4108d9a4c14)`(self,`[`height`](#classbitprim_1_1Block_1a7d8e2c22055d9d5247969f709d2b574b)`)` + +int: returns '1' if coinbase claim is not higher than the deserved reward. + +Args: + height (unsigned int): height of the block in the chain. + +#### `public def `[`is_valid_coinbase_script`](#classbitprim_1_1Block_1a0b1d70c44c0f94090f5f3dc2b2730fc2)`(self,`[`height`](#classbitprim_1_1Block_1a7d8e2c22055d9d5247969f709d2b574b)`)` + +int: returns '1' if coinbase script is valid. + +#### `public def `[`is_valid_merkle_root`](#classbitprim_1_1Block_1a53e999a14dc396d90606155c384a9848)`(self)` + +int: returns '1' if the generated merkle root is equal to the Header merkle root. + +# class `bitprim::BlockList` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1BlockList_1af0275513907dd01841efb2707040f947)`(self,ptr)` | +`public def `[`__del__`](#classbitprim_1_1BlockList_1a2b0db7ee43138ad3ac6dede1e576d379)`(self)` | +`public def `[`construct_default`](#classbitprim_1_1BlockList_1a294964864e12b86ea650841c384e80c4)`(self)` | +`public def `[`push_back`](#classbitprim_1_1BlockList_1a0da9e5cf1747039d4538fcc9876d75a8)`(self,block)` | +`public def `[`list_count`](#classbitprim_1_1BlockList_1a3696b14ba1271ae45e3be336266f89c3)`(self)` | +`public def `[`__getitem__`](#classbitprim_1_1BlockList_1ad4d132428d9d3f6156fc4848720f640a)`(self,key)` | + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1BlockList_1af0275513907dd01841efb2707040f947)`(self,ptr)` + +#### `public def `[`__del__`](#classbitprim_1_1BlockList_1a2b0db7ee43138ad3ac6dede1e576d379)`(self)` + +#### `public def `[`construct_default`](#classbitprim_1_1BlockList_1a294964864e12b86ea650841c384e80c4)`(self)` + +#### `public def `[`push_back`](#classbitprim_1_1BlockList_1a0da9e5cf1747039d4538fcc9876d75a8)`(self,block)` + +#### `public def `[`list_count`](#classbitprim_1_1BlockList_1a3696b14ba1271ae45e3be336266f89c3)`(self)` + +#### `public def `[`__getitem__`](#classbitprim_1_1BlockList_1ad4d132428d9d3f6156fc4848720f640a)`(self,key)` + +# class `bitprim::Chain` + +Represents the Bitcoin blockchain. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public `[`history_fetch_handler_`](#classbitprim_1_1Chain_1aa966de86303a5df511cdbd20fba36027) | +`public `[`fetch_block_header_handler_`](#classbitprim_1_1Chain_1ae2925200c9e3213b288672c130ca5d7c) | +`public def `[`__init__`](#classbitprim_1_1Chain_1a91d2e01fb06a95e28761bc33580be399)`(self,chain)` | +`public def `[`fetch_last_height`](#classbitprim_1_1Chain_1a3b2aaba82203b00addff05747f630443)`(self,handler)` | Gets the height of the highest block in the chain. +`public def `[`fetch_history`](#classbitprim_1_1Chain_1a8654c1cd107ce5455a3bf202a65ee6ac)`(self,address,limit,from_height,handler)` | Get list of output points, values, and spends for a payment address. +`public def `[`fetch_stealth`](#classbitprim_1_1Chain_1a1b87b8c0f9320c2c2e344297dee65b0f)`(self,binary_filter_str,from_height,handler)` | Get metadata on potential payment transactions by stealth filter. +`public def `[`fetch_block_height`](#classbitprim_1_1Chain_1a99c62752f73e9b7ef8402863a04ad4a9)`(self,hash,handler)` | Given a block hash, it cues the chain for the block height. +`public def `[`fetch_block_header_by_height`](#classbitprim_1_1Chain_1a094aa543335f147e7b6e48ad010ca070)`(self,height,handler)` | Get the block header from the specified height in the chain. +`public def `[`fetch_block_header_by_hash`](#classbitprim_1_1Chain_1aad170dbb1d2c7978414221a609856720)`(self,hash,handler)` | Get the block header from the specified block hash. +`public def `[`fetch_block_by_height`](#classbitprim_1_1Chain_1a284806f124ea0f94efdac5fa679993ad)`(self,height,handler)` | Gets a block from the specified height in the chain. +`public def `[`fetch_block_by_hash`](#classbitprim_1_1Chain_1a6d223f504ce3452988ffc2f84b27b2a4)`(self,hash,handler)` | Gets a block from the specified hash. +`public def `[`fetch_merkle_block_by_height`](#classbitprim_1_1Chain_1ae445ca8c6d5baaa009d08c98634246aa)`(self,height,handler)` | Given a block height in the chain, it retrieves a merkle block. +`public def `[`fetch_merkle_block_by_hash`](#classbitprim_1_1Chain_1a7e4efae5160fe3615e608ec41e71f758)`(self,hash,handler)` | Given a block hash, it retrieves a merkle block. +`public def `[`fetch_transaction`](#classbitprim_1_1Chain_1a1d85163b2ba7b815f0bfa997c3dbd442)`(self,hashn,require_confirmed,handler)` | Get a transaction by its hash. +`public def `[`fetch_output`](#classbitprim_1_1Chain_1a72218a16849f5a0c8054be336658caf1)`(self,hashn,index,require_confirmed,handler)` | Get a transaction output by its transaction hash and index inside the transaction. +`public def `[`fetch_transaction_position`](#classbitprim_1_1Chain_1a5024c70760381fc3eada646bba4a5c8e)`(self,hashn,require_confirmed,handler)` | Given a transaction hash it fetches the height and position inside the block. +`public def `[`validate_tx`](#classbitprim_1_1Chain_1a376f1a70435c94ee95d27dad2c66c6aa)`(self,transaction,handler)` | Determine if a transaction is valid for submission to the blockchain. +`public def `[`fetch_spend`](#classbitprim_1_1Chain_1ae1bd60745bb42815e14901925e6e6558)`(self,output_point,handler)` | Fetch the transaction input which spends the indicated output. The `fetch_spend_handler` will be executed after cueing the chain. + +## Members + +#### `public `[`history_fetch_handler_`](#classbitprim_1_1Chain_1aa966de86303a5df511cdbd20fba36027) + +#### `public `[`fetch_block_header_handler_`](#classbitprim_1_1Chain_1ae2925200c9e3213b288672c130ca5d7c) + +#### `public def `[`__init__`](#classbitprim_1_1Chain_1a91d2e01fb06a95e28761bc33580be399)`(self,chain)` + +#### `public def `[`fetch_last_height`](#classbitprim_1_1Chain_1a3b2aaba82203b00addff05747f630443)`(self,handler)` + +Gets the height of the highest block in the chain. + +Args: + handler (Callable (error, block_height)): Will be executed when the chain is cued. + +* error (int): error code. 0 if successfull. +* block_height (unsigned int): height of the highest block in the chain. + +#### `public def `[`fetch_history`](#classbitprim_1_1Chain_1a8654c1cd107ce5455a3bf202a65ee6ac)`(self,address,limit,from_height,handler)` + +Get list of output points, values, and spends for a payment address. + +Args: + address (PaymentAddress): wallet to search. + limit (unsigned int): max amount of results to fetch. + from_height (unsigned int): minimum height to search for transactions. + handler (Callable (error, list)): Will be executed when the chain is cued. + +* error (int): error code. 0 if successfull. +* list (HistoryList): list with every element found. + +#### `public def `[`fetch_stealth`](#classbitprim_1_1Chain_1a1b87b8c0f9320c2c2e344297dee65b0f)`(self,binary_filter_str,from_height,handler)` + +Get metadata on potential payment transactions by stealth filter. +Given a filter and a height in the chain it cues the chain for transactions matching the provided filter. + +Args: + binary_filter_str (string): Must be at least 8 bits in lenght. example "10101010" + from_height (unsigned int): minimum height in the chain where to look for transactions. + handler (Callable (error, list)): Will be executed after the chain is cued. + +* error (int): error code. 0 if successfull. +* list (StealthList): list with every transaction matching the given filter. + +#### `public def `[`fetch_block_height`](#classbitprim_1_1Chain_1a99c62752f73e9b7ef8402863a04ad4a9)`(self,hash,handler)` + +Given a block hash, it cues the chain for the block height. + +Args: + hash (bytearray): 32 bytes of the block hash. + handler (Callable (error, block_height)): Will be executed after the chain is cued. + +* error (int): error code. 0 if successfull. +* block_height (unsigned int): height of the block in the chain. + +#### `public def `[`fetch_block_header_by_height`](#classbitprim_1_1Chain_1a094aa543335f147e7b6e48ad010ca070)`(self,height,handler)` + +Get the block header from the specified height in the chain. + +Args: + height (unsigned int): block height in the chain. + handler (Callable (error, block_header)): Will be executed after the chain is cued. + +* error (int): error code. 0 if successfull. +* block_header (Header): header of the block found. + +#### `public def `[`fetch_block_header_by_hash`](#classbitprim_1_1Chain_1aad170dbb1d2c7978414221a609856720)`(self,hash,handler)` + +Get the block header from the specified block hash. + +Args: + hash (bytearray): 32 bytes of the block hash. + handler (Callable (error, block_header)): Will be executed after the chain is cued. + +* error (int): error code. 0 if successfull. +* block_header (Header): header of the block found. + +#### `public def `[`fetch_block_by_height`](#classbitprim_1_1Chain_1a284806f124ea0f94efdac5fa679993ad)`(self,height,handler)` + +Gets a block from the specified height in the chain. + +Args: + height (unsigned int): block height in the chain. + handler (Callable (error, block)): Will be executed after the chain is cued. + +* error (int): error code. 0 if successfull. +* block (Block): block at the defined height in the chain. + +#### `public def `[`fetch_block_by_hash`](#classbitprim_1_1Chain_1a6d223f504ce3452988ffc2f84b27b2a4)`(self,hash,handler)` + +Gets a block from the specified hash. + +Args: + hash (bytearray): 32 bytes of the block hash. + handler (Callable (error, block)): Will be executed after the chain is cued. + +* error (int): error code. 0 if successfull. +* block (Block): block found with the specified hash. + +#### `public def `[`fetch_merkle_block_by_height`](#classbitprim_1_1Chain_1ae445ca8c6d5baaa009d08c98634246aa)`(self,height,handler)` + +Given a block height in the chain, it retrieves a merkle block. + +Args: + height (unsigned int): block height in the chain. + handler (Callable (error, merkle_block, block_height)): Will be executed when the chain is cued. + +* error (int): error code. 0 if successfull. +* merkle_block (MerkleBlock): merkle block of the block found at the specified height. +* block_height (unsigned int): height of the block in the chain. + +#### `public def `[`fetch_merkle_block_by_hash`](#classbitprim_1_1Chain_1a7e4efae5160fe3615e608ec41e71f758)`(self,hash,handler)` + +Given a block hash, it retrieves a merkle block. + +Args: + hash (bytearray): 32 bytes of the block hash. + handler (Callable (error, merkle_block, block_height)): Will be executed when the chain is cued. + +* error (int): error code. 0 if successfull. +* merkle_block (MerkleBlock): merkle block of the block found with the given hash. +* block_height (unsigned int): height of the block in the chain. + +#### `public def `[`fetch_transaction`](#classbitprim_1_1Chain_1a1d85163b2ba7b815f0bfa997c3dbd442)`(self,hashn,require_confirmed,handler)` + +Get a transaction by its hash. + +Args: + hashn (bytearray): 32 bytes of the transaction hash. + require_confirmed (int): if transaction should be in a block. 0 if not. + handler (Callable (error, transaction, block_height, tx_index)): Will be executed when the chain is cued. + +* error (int): error code. 0 if successfull. +* transaction (Transaction): Transaction found. +* block_height (unsigned int): height in the chain of the block containing the transaction. +* tx_index (unsigned int): index of the transaction inside the block. + +#### `public def `[`fetch_output`](#classbitprim_1_1Chain_1a72218a16849f5a0c8054be336658caf1)`(self,hashn,index,require_confirmed,handler)` + +Get a transaction output by its transaction hash and index inside the transaction. + +Args: + hashn (bytearray): 32 bytes of the transaction hash. + index (unsigned int): index of the output in the transaction. + require_confirmed (int): if transaction should be in a block. 0 if not. + handler (Callable (error, output)): Will be executed when the chain is cued. + +* error (int): error code. 0 if successfull. +* output (Output): output found. + +#### `public def `[`fetch_transaction_position`](#classbitprim_1_1Chain_1a5024c70760381fc3eada646bba4a5c8e)`(self,hashn,require_confirmed,handler)` + +Given a transaction hash it fetches the height and position inside the block. + +Args: + hash (bytearray): 32 bytes of the transaction hash. + require_confirmed (int): if transaction should be in a block. 0 if not. + handler (Callable (error, block_height, tx_index)): Will be executed after the chain is cued. + +* error (int): error code. 0 if successfull. +* block_height (unsigned int): height of the block containing the transaction. +* tx_index (unsigned int): index in the block of the transaction. + +#### `public def `[`validate_tx`](#classbitprim_1_1Chain_1a376f1a70435c94ee95d27dad2c66c6aa)`(self,transaction,handler)` + +Determine if a transaction is valid for submission to the blockchain. + +Args: + transaction (Transaction): transaction to be checked. + handler (Callable (error, message)): Will be executed after the chain is cued. + +* error (int): error code. 0 if successfull. +* message (str): string describing the result of the cue. example: 'The transaction is valid' + +#### `public def `[`fetch_spend`](#classbitprim_1_1Chain_1ae1bd60745bb42815e14901925e6e6558)`(self,output_point,handler)` + +Fetch the transaction input which spends the indicated output. The `fetch_spend_handler` will be executed after cueing the chain. + +Args: + output_point (OutputPoint): tx hash and index pair. + handler (Callable (error, input_point)): Will be executed when the chain is cued. + +* error (int): error code. 0 if successfull. +* input_point (Point): Tx hash nad index pair where the output was spent. + +# class `bitprim::Executor` + +Controls the execution of the Bitprim bitcoin node. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1Executor_1af03d07adc2f2ffdac5b3255ee8b69967)`(self,path,sout,serr)` | +`public def `[`__del__`](#classbitprim_1_1Executor_1a0be33b77505fd6836f22b2177b98a941)`(self)` | +`public def `[`init_chain`](#classbitprim_1_1Executor_1a963a48bff1fa656636909d41c44ba1dd)`(self)` | bool: Initialization of the blockchain. +`public def `[`run`](#classbitprim_1_1Executor_1adc2614f1b1a53246eb5c99f57bf50d77)`(self)` | bool: Starts running the node, initializing blockchain download. +`public def `[`run_wait`](#classbitprim_1_1Executor_1a9e6c0c3764214ce25872821141461792)`(self)` | bool: Starts running the node, initializing blockchain download. +`public def `[`stop`](#classbitprim_1_1Executor_1a8c3abf988c9b8db664548ac9442331d1)`(self)` | bool: it stops the node. +`public def `[`chain`](#classbitprim_1_1Executor_1a6287206dcd5c0d0c87a20f48cf3f5632)`(self)` | Chain: Object containing the blockchain. +`public def `[`__enter__`](#classbitprim_1_1Executor_1ad18cf685fae0e24f51b869b069ec3527)`(self)` | +`public def `[`__exit__`](#classbitprim_1_1Executor_1a4e694437fd6b419d279c979a0fa8e1de)`(self,exc_type,exc_value,traceback)` | + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1Executor_1af03d07adc2f2ffdac5b3255ee8b69967)`(self,path,sout,serr)` + +#### `public def `[`__del__`](#classbitprim_1_1Executor_1a0be33b77505fd6836f22b2177b98a941)`(self)` + +#### `public def `[`init_chain`](#classbitprim_1_1Executor_1a963a48bff1fa656636909d41c44ba1dd)`(self)` + +bool: Initialization of the blockchain. +Returns 'TRUE' if successfull. + +#### `public def `[`run`](#classbitprim_1_1Executor_1adc2614f1b1a53246eb5c99f57bf50d77)`(self)` + +bool: Starts running the node, initializing blockchain download. +Returns 'TRUE' if successful. + +#### `public def `[`run_wait`](#classbitprim_1_1Executor_1a9e6c0c3764214ce25872821141461792)`(self)` + +bool: Starts running the node, initializing blockchain download. +It listen to wait signals. +Returns 'TRUE' if successful. + +#### `public def `[`stop`](#classbitprim_1_1Executor_1a8c3abf988c9b8db664548ac9442331d1)`(self)` + +bool: it stops the node. +precondition: self._running. +Returns 'TRUE' if successfull + +#### `public def `[`chain`](#classbitprim_1_1Executor_1a6287206dcd5c0d0c87a20f48cf3f5632)`(self)` + +Chain: Object containing the blockchain. + +#### `public def `[`__enter__`](#classbitprim_1_1Executor_1ad18cf685fae0e24f51b869b069ec3527)`(self)` + +#### `public def `[`__exit__`](#classbitprim_1_1Executor_1a4e694437fd6b419d279c979a0fa8e1de)`(self,exc_type,exc_value,traceback)` + +# class `bitprim::Header` + +Represent the Header of a Bitcoin Block. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1Header_1ab1054610e909b96de1bb2dd8028a765a)`(self,pointer,`[`height`](#classbitprim_1_1Header_1a38f5a0200aa5d54e3bdd9d9cc1a136e5)`,auto_destroy)` | Construction of the Header class object. +`public def `[`__del__`](#classbitprim_1_1Header_1a4b2baea19d3f69d1657398b393829900)`(self)` | +`public def `[`height`](#classbitprim_1_1Header_1a38f5a0200aa5d54e3bdd9d9cc1a136e5)`(self)` | unsigned int: Height of the block in the chain. +`public def `[`version`](#classbitprim_1_1Header_1a3f3b70f4c986cb07dffe85b5afba040c)`(self)` | unsigned int: protocol version of the header. +`public def `[`set_version`](#classbitprim_1_1Header_1a609e51d54c44345e0ec5dbfb191bc8ce)`(self,`[`version`](#classbitprim_1_1Header_1a3f3b70f4c986cb07dffe85b5afba040c)`)` | +`public def `[`previous_block_hash`](#classbitprim_1_1Header_1a6f69d5f8a25ca54e0c5f62b907d3d11b)`(self)` | bytearray: 32 bytes hash of the previous block in the chain. +`public def `[`merkle`](#classbitprim_1_1Header_1acb8f6ae7da9ce9fc322cf368cb990dea)`(self)` | bytearray: 32 bytes merkle root. +`public def `[`hash`](#classbitprim_1_1Header_1ab5e63722faa35d7a4842f91b252db8cf)`(self)` | bytearray: 32 bytes block hash. +`public def `[`timestamp`](#classbitprim_1_1Header_1a376f62f26bbb764768bbd877ec0501e4)`(self)` | unsigned int: block timestamp. +`public def `[`set_timestamp`](#classbitprim_1_1Header_1ae47b3d4b8916e020f0f904ac030ba42b)`(self,`[`timestamp`](#classbitprim_1_1Header_1a376f62f26bbb764768bbd877ec0501e4)`)` | +`public def `[`bits`](#classbitprim_1_1Header_1a9d9b68fb70720ef9ebf16f9bd8d3db41)`(self)` | unsigned int: value of bits. Difficulty threshold. +`public def `[`set_bits`](#classbitprim_1_1Header_1a239f8d73f8d4039bef0880082d877320)`(self,`[`bits`](#classbitprim_1_1Header_1a9d9b68fb70720ef9ebf16f9bd8d3db41)`)` | +`public def `[`nonce`](#classbitprim_1_1Header_1ac071c7567cb2ab2942baed4044b0c07d)`(self)` | unsigned int: the nonce that allowed this block to added to the blockchain. +`public def `[`set_nonce`](#classbitprim_1_1Header_1aa6db7b91c6d5eb191334973dea3856f0)`(self,`[`nonce`](#classbitprim_1_1Header_1ac071c7567cb2ab2942baed4044b0c07d)`)` | + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1Header_1ab1054610e909b96de1bb2dd8028a765a)`(self,pointer,`[`height`](#classbitprim_1_1Header_1a38f5a0200aa5d54e3bdd9d9cc1a136e5)`,auto_destroy)` + +Construction of the Header class object. + +Args: + pointer (Object): pointer to c implementation. + height (unsigned int): Height of the block in the chain. + auto_destroy (bool): the object will be deleted when out of scope.. + +#### `public def `[`__del__`](#classbitprim_1_1Header_1a4b2baea19d3f69d1657398b393829900)`(self)` + +#### `public def `[`height`](#classbitprim_1_1Header_1a38f5a0200aa5d54e3bdd9d9cc1a136e5)`(self)` + +unsigned int: Height of the block in the chain. + +#### `public def `[`version`](#classbitprim_1_1Header_1a3f3b70f4c986cb07dffe85b5afba040c)`(self)` + +unsigned int: protocol version of the header. + +#### `public def `[`set_version`](#classbitprim_1_1Header_1a609e51d54c44345e0ec5dbfb191bc8ce)`(self,`[`version`](#classbitprim_1_1Header_1a3f3b70f4c986cb07dffe85b5afba040c)`)` + +#### `public def `[`previous_block_hash`](#classbitprim_1_1Header_1a6f69d5f8a25ca54e0c5f62b907d3d11b)`(self)` + +bytearray: 32 bytes hash of the previous block in the chain. + +#### `public def `[`merkle`](#classbitprim_1_1Header_1acb8f6ae7da9ce9fc322cf368cb990dea)`(self)` + +bytearray: 32 bytes merkle root. + +#### `public def `[`hash`](#classbitprim_1_1Header_1ab5e63722faa35d7a4842f91b252db8cf)`(self)` + +bytearray: 32 bytes block hash. + +#### `public def `[`timestamp`](#classbitprim_1_1Header_1a376f62f26bbb764768bbd877ec0501e4)`(self)` + +unsigned int: block timestamp. + +#### `public def `[`set_timestamp`](#classbitprim_1_1Header_1ae47b3d4b8916e020f0f904ac030ba42b)`(self,`[`timestamp`](#classbitprim_1_1Header_1a376f62f26bbb764768bbd877ec0501e4)`)` + +#### `public def `[`bits`](#classbitprim_1_1Header_1a9d9b68fb70720ef9ebf16f9bd8d3db41)`(self)` + +unsigned int: value of bits. Difficulty threshold. + +#### `public def `[`set_bits`](#classbitprim_1_1Header_1a239f8d73f8d4039bef0880082d877320)`(self,`[`bits`](#classbitprim_1_1Header_1a9d9b68fb70720ef9ebf16f9bd8d3db41)`)` + +#### `public def `[`nonce`](#classbitprim_1_1Header_1ac071c7567cb2ab2942baed4044b0c07d)`(self)` + +unsigned int: the nonce that allowed this block to added to the blockchain. + +#### `public def `[`set_nonce`](#classbitprim_1_1Header_1aa6db7b91c6d5eb191334973dea3856f0)`(self,`[`nonce`](#classbitprim_1_1Header_1ac071c7567cb2ab2942baed4044b0c07d)`)` + +# class `bitprim::History` + +Output points, values, and spends for a payment address + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1History_1a73191eb84c2e5bdf08b8040a3879dde5)`(self,ptr)` | +`public def `[`point_kind`](#classbitprim_1_1History_1a9ec5efba6a4cc6b1909e293d3e412613)`(self)` | unsigned int: Used for differentiation. +`public def `[`point`](#classbitprim_1_1History_1a851ad89d09c17a1f6da17a9b020a209e)`(self)` | Point: point that identifies History. +`public def `[`height`](#classbitprim_1_1History_1adde220878b3bc05ebc000b12d4013a10)`(self)` | unsigned int: Height of the block containing the Point. +`public def `[`value_or_previous_checksum`](#classbitprim_1_1History_1a836dc64f95577b4e430133f3346bbaee)`(self)` | unsigned int: varies depending of point_kind. + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1History_1a73191eb84c2e5bdf08b8040a3879dde5)`(self,ptr)` + +#### `public def `[`point_kind`](#classbitprim_1_1History_1a9ec5efba6a4cc6b1909e293d3e412613)`(self)` + +unsigned int: Used for differentiation. + '0' output + '1' spend + +#### `public def `[`point`](#classbitprim_1_1History_1a851ad89d09c17a1f6da17a9b020a209e)`(self)` + +Point: point that identifies History. + +#### `public def `[`height`](#classbitprim_1_1History_1adde220878b3bc05ebc000b12d4013a10)`(self)` + +unsigned int: Height of the block containing the Point. + +#### `public def `[`value_or_previous_checksum`](#classbitprim_1_1History_1a836dc64f95577b4e430133f3346bbaee)`(self)` + +unsigned int: varies depending of point_kind. + +value: if output, then satoshi value of output. + +previous_checksum: if spend, then checksum hash of previous output_point. + +# class `bitprim::HistoryList` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public `[`constructed`](#classbitprim_1_1HistoryList_1a0a940029b8c0820b1f64f7123fce997a) | +`public def `[`__init__`](#classbitprim_1_1HistoryList_1a52db717ce2e113abe759524175991cfb)`(self,ptr)` | +`public def `[`__del__`](#classbitprim_1_1HistoryList_1a78658958bcfe9062ffe7fad75df4a284)`(self)` | +`public def `[`count`](#classbitprim_1_1HistoryList_1a121077ffd2e0c1787234489ca2b065e2)`(self)` | +`public def `[`nth`](#classbitprim_1_1HistoryList_1a78e90bb2ca57368f01dfbcaae0ab5155)`(self,n)` | +`public def `[`__getitem__`](#classbitprim_1_1HistoryList_1a41a6ea5aeac370e6a51e40497e95947b)`(self,key)` | + +## Members + +#### `public `[`constructed`](#classbitprim_1_1HistoryList_1a0a940029b8c0820b1f64f7123fce997a) + +#### `public def `[`__init__`](#classbitprim_1_1HistoryList_1a52db717ce2e113abe759524175991cfb)`(self,ptr)` + +#### `public def `[`__del__`](#classbitprim_1_1HistoryList_1a78658958bcfe9062ffe7fad75df4a284)`(self)` + +#### `public def `[`count`](#classbitprim_1_1HistoryList_1a121077ffd2e0c1787234489ca2b065e2)`(self)` + +#### `public def `[`nth`](#classbitprim_1_1HistoryList_1a78e90bb2ca57368f01dfbcaae0ab5155)`(self,n)` + +#### `public def `[`__getitem__`](#classbitprim_1_1HistoryList_1a41a6ea5aeac370e6a51e40497e95947b)`(self,key)` + +# class `bitprim::Input` + +Represents one of the inputs of a Transaction. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1Input_1ae13083fb6e70555b91861147ebff6329)`(self,ptr)` | +`public def `[`__del__`](#classbitprim_1_1Input_1aab52e334cbe944496a112bb726b21530)`(self)` | +`public def `[`is_valid`](#classbitprim_1_1Input_1ae29f9ee24d1a123f1dcce44393de606c)`(self)` | int: returns '0' if previous outputs or script are invalid. +`public def `[`is_final`](#classbitprim_1_1Input_1a76fccbec6192bf842745f7acb26adb85)`(self)` | int: returns '1' if sequence is equal to max_sequence. +`public def `[`serialized_size`](#classbitprim_1_1Input_1a0341dd46f71dd163a7e61fed469e9d15)`(self)` | unsigned int: size in bytes. +`public def `[`sequence`](#classbitprim_1_1Input_1a6116ec3110b937e98c12d4af036d14da)`(self)` | unsigned int: sequence number of inputs. if it equals max_sequence, txs is final. +`public def `[`signature_operations`](#classbitprim_1_1Input_1a29cff0c9139870bdc33225a935e461dd)`(self,bip16_active)` | unsigned int: amount of sigops in the script. +`public def `[`script`](#classbitprim_1_1Input_1a648a39c34feb63d42d658bbeaf88fdc5)`(self)` | Script: script object. +`public def `[`previous_output`](#classbitprim_1_1Input_1af9aec2095f608d93c6a3c31d5fd7adf9)`(self)` | OutputPoint: returns previous output, with transaction hash and index. + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1Input_1ae13083fb6e70555b91861147ebff6329)`(self,ptr)` + +#### `public def `[`__del__`](#classbitprim_1_1Input_1aab52e334cbe944496a112bb726b21530)`(self)` + +#### `public def `[`is_valid`](#classbitprim_1_1Input_1ae29f9ee24d1a123f1dcce44393de606c)`(self)` + +int: returns '0' if previous outputs or script are invalid. + +#### `public def `[`is_final`](#classbitprim_1_1Input_1a76fccbec6192bf842745f7acb26adb85)`(self)` + +int: returns '1' if sequence is equal to max_sequence. + +#### `public def `[`serialized_size`](#classbitprim_1_1Input_1a0341dd46f71dd163a7e61fed469e9d15)`(self)` + +unsigned int: size in bytes. + +#### `public def `[`sequence`](#classbitprim_1_1Input_1a6116ec3110b937e98c12d4af036d14da)`(self)` + +unsigned int: sequence number of inputs. if it equals max_sequence, txs is final. + +#### `public def `[`signature_operations`](#classbitprim_1_1Input_1a29cff0c9139870bdc33225a935e461dd)`(self,bip16_active)` + +unsigned int: amount of sigops in the script. + +Args: + bip16_active (int): '1' if bip 16 is active. '0' if not. + +#### `public def `[`script`](#classbitprim_1_1Input_1a648a39c34feb63d42d658bbeaf88fdc5)`(self)` + +Script: script object. + +#### `public def `[`previous_output`](#classbitprim_1_1Input_1af9aec2095f608d93c6a3c31d5fd7adf9)`(self)` + +OutputPoint: returns previous output, with transaction hash and index. + +# class `bitprim::InputList` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1InputList_1a78cd01531883ead04e5d1f1827afd2f0)`(self,ptr)` | +`public def `[`push_back`](#classbitprim_1_1InputList_1a57753b4177314fd616ab77f244c4b0c2)`(self,inputn)` | +`public def `[`list_count`](#classbitprim_1_1InputList_1adc59d443ae7e6ddf904531e0e79eff38)`(self)` | +`public def `[`__getitem__`](#classbitprim_1_1InputList_1abda9474f6b9bf410d501db3628649483)`(self,key)` | + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1InputList_1a78cd01531883ead04e5d1f1827afd2f0)`(self,ptr)` + +#### `public def `[`push_back`](#classbitprim_1_1InputList_1a57753b4177314fd616ab77f244c4b0c2)`(self,inputn)` + +#### `public def `[`list_count`](#classbitprim_1_1InputList_1adc59d443ae7e6ddf904531e0e79eff38)`(self)` + +#### `public def `[`__getitem__`](#classbitprim_1_1InputList_1abda9474f6b9bf410d501db3628649483)`(self,key)` + +# class `bitprim::MerkleBlock` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1MerkleBlock_1a23c009fc36170debc9e12fc94b330dda)`(self,pointer,`[`height`](#classbitprim_1_1MerkleBlock_1ab0ebe70c231ddd6e34769eda3778544b)`)` | +`public def `[`height`](#classbitprim_1_1MerkleBlock_1ab0ebe70c231ddd6e34769eda3778544b)`(self)` | unsigned int: Height of the block in the chain. +`public def `[`__del__`](#classbitprim_1_1MerkleBlock_1add318592cfd1e07138c9a06648e7b560)`(self)` | +`public def `[`header`](#classbitprim_1_1MerkleBlock_1a16d8f19f35c6fef29d314fbcc3e325fd)`(self)` | Header: header of the block. +`public def `[`is_valid`](#classbitprim_1_1MerkleBlock_1a8b8e074604860353111fba463d3b3c66)`(self)` | int: returns true if it cointains txs hashes, and header is valid. +`public def `[`hash_count`](#classbitprim_1_1MerkleBlock_1a0cd99a8fda5faaf504f3aed41ccbb3de)`(self)` | unsigned int: size of the transaction hashes list. +`public def `[`serialized_size`](#classbitprim_1_1MerkleBlock_1a4bd735a5ec63b1ab7b505073932fb629)`(self,version)` | unsigned int: size of the block in bytes. +`public def `[`total_transaction_count`](#classbitprim_1_1MerkleBlock_1ae8e7f4689bb58379a42ab18211c7e4ae)`(self)` | unsigned int: transactions included in the block. +`public def `[`reset`](#classbitprim_1_1MerkleBlock_1a27ba9a21dc72f6233f9c9d45946ad13e)`(self)` | void: delete all the data inside the block. + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1MerkleBlock_1a23c009fc36170debc9e12fc94b330dda)`(self,pointer,`[`height`](#classbitprim_1_1MerkleBlock_1ab0ebe70c231ddd6e34769eda3778544b)`)` + +#### `public def `[`height`](#classbitprim_1_1MerkleBlock_1ab0ebe70c231ddd6e34769eda3778544b)`(self)` + +unsigned int: Height of the block in the chain. + +#### `public def `[`__del__`](#classbitprim_1_1MerkleBlock_1add318592cfd1e07138c9a06648e7b560)`(self)` + +#### `public def `[`header`](#classbitprim_1_1MerkleBlock_1a16d8f19f35c6fef29d314fbcc3e325fd)`(self)` + +Header: header of the block. + +#### `public def `[`is_valid`](#classbitprim_1_1MerkleBlock_1a8b8e074604860353111fba463d3b3c66)`(self)` + +int: returns true if it cointains txs hashes, and header is valid. + +#### `public def `[`hash_count`](#classbitprim_1_1MerkleBlock_1a0cd99a8fda5faaf504f3aed41ccbb3de)`(self)` + +unsigned int: size of the transaction hashes list. + +#### `public def `[`serialized_size`](#classbitprim_1_1MerkleBlock_1a4bd735a5ec63b1ab7b505073932fb629)`(self,version)` + +unsigned int: size of the block in bytes. + +Args: + version (unsigned int): block protocol version. + +#### `public def `[`total_transaction_count`](#classbitprim_1_1MerkleBlock_1ae8e7f4689bb58379a42ab18211c7e4ae)`(self)` + +unsigned int: transactions included in the block. + +#### `public def `[`reset`](#classbitprim_1_1MerkleBlock_1a27ba9a21dc72f6233f9c9d45946ad13e)`(self)` + +void: delete all the data inside the block. + +# class `bitprim::Output` + +Represents one of the outputs of a Transaction. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1Output_1ac72bdb2e1bb09bef47eda818fd6f1867)`(self,ptr)` | +`public def `[`__del__`](#classbitprim_1_1Output_1ad7b4b7aa1483e0a2b1e176a709e954c5)`(self)` | +`public def `[`is_valid`](#classbitprim_1_1Output_1a51b38d7bcdac902c5d3815ebd218175f)`(self)` | int: returns '0' if output is not found. +`public def `[`serialized_size`](#classbitprim_1_1Output_1aac3a6e139f1b5a651e5c957103ee843f)`(self,wire)` | unsigned int: size in bytes. +`public def `[`value`](#classbitprim_1_1Output_1a795ca3150bebcb0ac3cd183869a24586)`(self)` | unsigned int: returns output value. +`public def `[`signature_operations`](#classbitprim_1_1Output_1aca5e32f4be5d0d2ee4e5bb6bc36c395f)`(self)` | unsigned int: amount of signature operations in script. +`public def `[`script`](#classbitprim_1_1Output_1a274170cfeabb30c64f2540054c82dc5c)`(self)` | Script: returns the output script. + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1Output_1ac72bdb2e1bb09bef47eda818fd6f1867)`(self,ptr)` + +#### `public def `[`__del__`](#classbitprim_1_1Output_1ad7b4b7aa1483e0a2b1e176a709e954c5)`(self)` + +#### `public def `[`is_valid`](#classbitprim_1_1Output_1a51b38d7bcdac902c5d3815ebd218175f)`(self)` + +int: returns '0' if output is not found. + +#### `public def `[`serialized_size`](#classbitprim_1_1Output_1aac3a6e139f1b5a651e5c957103ee843f)`(self,wire)` + +unsigned int: size in bytes. + +Args: + wire (bool): if 'TRUE' size will include size of 'uint32' for storing spender height. + +#### `public def `[`value`](#classbitprim_1_1Output_1a795ca3150bebcb0ac3cd183869a24586)`(self)` + +unsigned int: returns output value. + +#### `public def `[`signature_operations`](#classbitprim_1_1Output_1aca5e32f4be5d0d2ee4e5bb6bc36c395f)`(self)` + +unsigned int: amount of signature operations in script. + +#### `public def `[`script`](#classbitprim_1_1Output_1a274170cfeabb30c64f2540054c82dc5c)`(self)` + +Script: returns the output script. + +# class `bitprim::OutputList` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1OutputList_1a960450aa4813cbd58396551499623da2)`(self,ptr)` | +`public def `[`push_back`](#classbitprim_1_1OutputList_1aaf6aaff75f7b2b9b3932c9eb30a80c02)`(self,output)` | +`public def `[`list_count`](#classbitprim_1_1OutputList_1aa0906a801a9402bbf962f6aa95940c67)`(self)` | +`public def `[`__getitem__`](#classbitprim_1_1OutputList_1add8fdca3e7916ae48fa88cdc63fcad8d)`(self,key)` | + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1OutputList_1a960450aa4813cbd58396551499623da2)`(self,ptr)` + +#### `public def `[`push_back`](#classbitprim_1_1OutputList_1aaf6aaff75f7b2b9b3932c9eb30a80c02)`(self,output)` + +#### `public def `[`list_count`](#classbitprim_1_1OutputList_1aa0906a801a9402bbf962f6aa95940c67)`(self)` + +#### `public def `[`__getitem__`](#classbitprim_1_1OutputList_1add8fdca3e7916ae48fa88cdc63fcad8d)`(self,key)` + +# class `bitprim::OutputPoint` + +Transaction hash and index representing one of the transaction outputs. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1OutputPoint_1afa86b39354747b6cec4af931c7ec72b2)`(self,ptr)` | +`public def `[`hash`](#classbitprim_1_1OutputPoint_1a856c2a088c013a6eb786be10b6559695)`(self)` | bytearray: 32 bytes of the transaction hash. +`public def `[`__del__`](#classbitprim_1_1OutputPoint_1a1ecd26d135fced6148b47ff0935ee148)`(self)` | +`public def `[`index`](#classbitprim_1_1OutputPoint_1a9f2026dc8ea6f24a951bdcd87d1e12de)`(self)` | unsigned int: position of the output in the transaction. +`public def `[`construct`](#classbitprim_1_1OutputPoint_1a01668dcd11e97994c8c1c5d14a2efa07)`(self)` | OutputPoint: creates an empty output point. +`public def `[`construct_from_hash_index`](#classbitprim_1_1OutputPoint_1a1d421f77d0518ce53469ba18c58c1bbc)`(self,hashn,`[`index`](#classbitprim_1_1OutputPoint_1a9f2026dc8ea6f24a951bdcd87d1e12de)`)` | Outputpoint: creates an OutputPoint from a transaction hash and index pair. + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1OutputPoint_1afa86b39354747b6cec4af931c7ec72b2)`(self,ptr)` + +#### `public def `[`hash`](#classbitprim_1_1OutputPoint_1a856c2a088c013a6eb786be10b6559695)`(self)` + +bytearray: 32 bytes of the transaction hash. + +#### `public def `[`__del__`](#classbitprim_1_1OutputPoint_1a1ecd26d135fced6148b47ff0935ee148)`(self)` + +#### `public def `[`index`](#classbitprim_1_1OutputPoint_1a9f2026dc8ea6f24a951bdcd87d1e12de)`(self)` + +unsigned int: position of the output in the transaction. + +#### `public def `[`construct`](#classbitprim_1_1OutputPoint_1a01668dcd11e97994c8c1c5d14a2efa07)`(self)` + +OutputPoint: creates an empty output point. + +#### `public def `[`construct_from_hash_index`](#classbitprim_1_1OutputPoint_1a1d421f77d0518ce53469ba18c58c1bbc)`(self,hashn,`[`index`](#classbitprim_1_1OutputPoint_1a9f2026dc8ea6f24a951bdcd87d1e12de)`)` + +Outputpoint: creates an OutputPoint from a transaction hash and index pair. + +Args: + + hashn (bytearray): 32 bytes of the transaction hash. + index (unsigned int): position of the output in the transaction. + +# class `bitprim::PaymentAddress` + +Represents a Bitcoin wallet address. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1PaymentAddress_1a716ff66b7cfa1bab2049d6809b7144fd)`(self,ptr)` | +`public def `[`encoded`](#classbitprim_1_1PaymentAddress_1a44c336a955badc58d015de528cf04c44)`(self)` | str: readable format of the address. +`public def `[`version`](#classbitprim_1_1PaymentAddress_1a53ccf810b1ad7d0ef3c6fd20a8cf5c61)`(self)` | unsigned int: address version. +`public def `[`construct_from_string`](#classbitprim_1_1PaymentAddress_1ad585e303e02efc54442cc983f71176d8)`(self,address)` | Creates the Payment Address based on the received string. + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1PaymentAddress_1a716ff66b7cfa1bab2049d6809b7144fd)`(self,ptr)` + +#### `public def `[`encoded`](#classbitprim_1_1PaymentAddress_1a44c336a955badc58d015de528cf04c44)`(self)` + +str: readable format of the address. + +#### `public def `[`version`](#classbitprim_1_1PaymentAddress_1a53ccf810b1ad7d0ef3c6fd20a8cf5c61)`(self)` + +unsigned int: address version. + +#### `public def `[`construct_from_string`](#classbitprim_1_1PaymentAddress_1ad585e303e02efc54442cc983f71176d8)`(self,address)` + +Creates the Payment Address based on the received string. + +Args: + address(str): a base58 address. example '1MLVpZC2CTFHheox8SCEnAbW5NBdewRTdR' + +# class `bitprim::Point` + +Represents one of the txs input. +It's a pair of transaction hash and index. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1Point_1a1b2ccac61ef8fe0f2f61aaf58c98fb6c)`(self,ptr)` | +`public def `[`hash`](#classbitprim_1_1Point_1a46bdd0b6d7df9c3576654b5a091a7263)`(self)` | Hash of the transaction. +`public def `[`is_valid`](#classbitprim_1_1Point_1a6adb5ce23e3ffdd311d07f1fda16d387)`(self)` | returns true if its not null. +`public def `[`index`](#classbitprim_1_1Point_1a876f64f8a82b16ea369a2f1dd4c61be2)`(self)` | Position of the Input in the transaction. +`public def `[`checksum`](#classbitprim_1_1Point_1a547cbaeb732a493881566efc0cc02f9a)`(self)` | This is used with output_point identification within a set of history rows + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1Point_1a1b2ccac61ef8fe0f2f61aaf58c98fb6c)`(self,ptr)` + +#### `public def `[`hash`](#classbitprim_1_1Point_1a46bdd0b6d7df9c3576654b5a091a7263)`(self)` + +Hash of the transaction. + +Returns: + bytearray: 32 bytes. + +#### `public def `[`is_valid`](#classbitprim_1_1Point_1a6adb5ce23e3ffdd311d07f1fda16d387)`(self)` + +returns true if its not null. + +Returns: + bool + +#### `public def `[`index`](#classbitprim_1_1Point_1a876f64f8a82b16ea369a2f1dd4c61be2)`(self)` + +Position of the Input in the transaction. + +Returns: + unsigned int. + +#### `public def `[`checksum`](#classbitprim_1_1Point_1a547cbaeb732a493881566efc0cc02f9a)`(self)` + +This is used with output_point identification within a set of history rows +of the same address. Collision will result in miscorrelation of points by +client callers. This is NOT a bitcoin checksum. + +Returns: + unsigned int. + +# class `bitprim::Script` + +Represents transaction scripts. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1Script_1a71167ed9cb1444e1bbed71834469ee05)`(self,ptr,auto_destroy)` | +`public def `[`__del__`](#classbitprim_1_1Script_1adc903b82b180174f84576bc0389bbf1f)`(self)` | +`public def `[`is_valid`](#classbitprim_1_1Script_1a5a22ae4af12fd6fc4c2c40f30802da2c)`(self)` | int: All script bytes are valid under some circumstance (e.g. coinbase). +`public def `[`is_valid_operations`](#classbitprim_1_1Script_1a611ffd4030e23d79d54ae18950f9e024)`(self)` | int: Script validity is independent of individual operation validity. +`public def `[`satoshi_content_size`](#classbitprim_1_1Script_1aeca70284e86f8042d28e77e31cd0a894)`(self)` | unsigned int: size in bytes. +`public def `[`serialized_size`](#classbitprim_1_1Script_1a5347d3490612815abb1a009d45abf880)`(self,prefix)` | unsigned int: size in bytes. If prefix '1' size includes a var int size. +`public def `[`to_string`](#classbitprim_1_1Script_1a8a77d30fc38c0b278aedbc59af993d8e)`(self,active_forks)` | str: translate operations in the script to string. +`public def `[`sigops`](#classbitprim_1_1Script_1ab0dffa99e266f48d352ece4ddf4f5a4f)`(self,embedded)` | unsigned int: amount of signature operations in the script. +`public def `[`embedded_sigops`](#classbitprim_1_1Script_1a87b18a27b56aa2c5309c9bbd43fdfd76)`(self,prevout_script)` | unsigned int: Count the sigops in the embedded script using BIP16 rules. + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1Script_1a71167ed9cb1444e1bbed71834469ee05)`(self,ptr,auto_destroy)` + +#### `public def `[`__del__`](#classbitprim_1_1Script_1adc903b82b180174f84576bc0389bbf1f)`(self)` + +#### `public def `[`is_valid`](#classbitprim_1_1Script_1a5a22ae4af12fd6fc4c2c40f30802da2c)`(self)` + +int: All script bytes are valid under some circumstance (e.g. coinbase). +Returns '0' if a prefix and byte count does not match. + +#### `public def `[`is_valid_operations`](#classbitprim_1_1Script_1a611ffd4030e23d79d54ae18950f9e024)`(self)` + +int: Script validity is independent of individual operation validity. +There is a trailing invalid/default op if a push op had a size mismatch. + +#### `public def `[`satoshi_content_size`](#classbitprim_1_1Script_1aeca70284e86f8042d28e77e31cd0a894)`(self)` + +unsigned int: size in bytes. + +#### `public def `[`serialized_size`](#classbitprim_1_1Script_1a5347d3490612815abb1a009d45abf880)`(self,prefix)` + +unsigned int: size in bytes. If prefix '1' size includes a var int size. + +Args: + prefix (bool): include prefix size in the final result. + +#### `public def `[`to_string`](#classbitprim_1_1Script_1a8a77d30fc38c0b278aedbc59af993d8e)`(self,active_forks)` + +str: translate operations in the script to string. + +Args: + active_forks (unsigned int): which rule is active. + +#### `public def `[`sigops`](#classbitprim_1_1Script_1ab0dffa99e266f48d352ece4ddf4f5a4f)`(self,embedded)` + +unsigned int: amount of signature operations in the script. + +Args: + embedded (bool): is embedded script. + +#### `public def `[`embedded_sigops`](#classbitprim_1_1Script_1a87b18a27b56aa2c5309c9bbd43fdfd76)`(self,prevout_script)` + +unsigned int: Count the sigops in the embedded script using BIP16 rules. + +# class `bitprim::Stealth` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1Stealth_1a66223b8a9e25e938b27fb90e305131b6)`(self,ptr)` | +`public def `[`ephemeral_public_key_hash`](#classbitprim_1_1Stealth_1ac5b81ac8a33db2fc11076c7741944c5b)`(self)` | bytearray: 33 bytes. Includes the sign byte (0x02) +`public def `[`transaction_hash`](#classbitprim_1_1Stealth_1a0c2c65c2e7956f422da41e405945ed8b)`(self)` | bytearray: 32 bytes. +`public def `[`public_key_hash`](#classbitprim_1_1Stealth_1a91e692b85f2aca1bff55cef53a7d8f7f)`(self)` | bytearray: 20 bytes. + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1Stealth_1a66223b8a9e25e938b27fb90e305131b6)`(self,ptr)` + +#### `public def `[`ephemeral_public_key_hash`](#classbitprim_1_1Stealth_1ac5b81ac8a33db2fc11076c7741944c5b)`(self)` + +bytearray: 33 bytes. Includes the sign byte (0x02) + +#### `public def `[`transaction_hash`](#classbitprim_1_1Stealth_1a0c2c65c2e7956f422da41e405945ed8b)`(self)` + +bytearray: 32 bytes. + +#### `public def `[`public_key_hash`](#classbitprim_1_1Stealth_1a91e692b85f2aca1bff55cef53a7d8f7f)`(self)` + +bytearray: 20 bytes. + +# class `bitprim::StealthCompact` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1StealthCompact_1a096b83602f54149f4a057b2f5e0b537b)`(self,ptr)` | +`public def `[`ephemeral_public_key_hash`](#classbitprim_1_1StealthCompact_1a321f69a0c64289dd915079e6eb0f34e8)`(self)` | bytearray: 32 bytes. Excludes the sign byte (0x02) +`public def `[`transaction_hash`](#classbitprim_1_1StealthCompact_1afc2e71f2147e7c788ce9f475281f2e20)`(self)` | bytearray: 32 bytes. +`public def `[`public_key_hash`](#classbitprim_1_1StealthCompact_1a62d4aaec36ca9aa5a544097fa9bed367)`(self)` | bytearray: 20 bytes. + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1StealthCompact_1a096b83602f54149f4a057b2f5e0b537b)`(self,ptr)` + +#### `public def `[`ephemeral_public_key_hash`](#classbitprim_1_1StealthCompact_1a321f69a0c64289dd915079e6eb0f34e8)`(self)` + +bytearray: 32 bytes. Excludes the sign byte (0x02) + +#### `public def `[`transaction_hash`](#classbitprim_1_1StealthCompact_1afc2e71f2147e7c788ce9f475281f2e20)`(self)` + +bytearray: 32 bytes. + +#### `public def `[`public_key_hash`](#classbitprim_1_1StealthCompact_1a62d4aaec36ca9aa5a544097fa9bed367)`(self)` + +bytearray: 20 bytes. + +# class `bitprim::StealthCompactList` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1StealthCompactList_1a80eb34701f18beaddfc056bc81e046c5)`(self,ptr)` | +`public def `[`__del__`](#classbitprim_1_1StealthCompactList_1a00aedbc6e343018dfb192dc7fbd1773e)`(self)` | +`public def `[`list_count`](#classbitprim_1_1StealthCompactList_1a9d76141b462701811573a90d4a87f9b9)`(self)` | +`public def `[`__getitem__`](#classbitprim_1_1StealthCompactList_1a13259edfd3730528a6f025bfc09b9c2d)`(self,key)` | + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1StealthCompactList_1a80eb34701f18beaddfc056bc81e046c5)`(self,ptr)` + +#### `public def `[`__del__`](#classbitprim_1_1StealthCompactList_1a00aedbc6e343018dfb192dc7fbd1773e)`(self)` + +#### `public def `[`list_count`](#classbitprim_1_1StealthCompactList_1a9d76141b462701811573a90d4a87f9b9)`(self)` + +#### `public def `[`__getitem__`](#classbitprim_1_1StealthCompactList_1a13259edfd3730528a6f025bfc09b9c2d)`(self,key)` + +# class `bitprim::StealthList` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public `[`constructed`](#classbitprim_1_1StealthList_1a84aebac541d7b2c7601c6f6d2aca2832) | +`public def `[`__init__`](#classbitprim_1_1StealthList_1a8ba200a5cb697338d42c5950c8dc5735)`(self,ptr)` | +`public def `[`__del__`](#classbitprim_1_1StealthList_1a6e55a0d3c29eeb27f5150c7758cd3dfb)`(self)` | +`public def `[`count`](#classbitprim_1_1StealthList_1a12f2cede95c9e4b47ae9aeff6c7b2ff7)`(self)` | +`public def `[`nth`](#classbitprim_1_1StealthList_1a2565c5589877c4b44979148f1ac91eed)`(self,n)` | +`public def `[`__getitem__`](#classbitprim_1_1StealthList_1af8ab11d6980e5e5873f41e0acea9df49)`(self,key)` | + +## Members + +#### `public `[`constructed`](#classbitprim_1_1StealthList_1a84aebac541d7b2c7601c6f6d2aca2832) + +#### `public def `[`__init__`](#classbitprim_1_1StealthList_1a8ba200a5cb697338d42c5950c8dc5735)`(self,ptr)` + +#### `public def `[`__del__`](#classbitprim_1_1StealthList_1a6e55a0d3c29eeb27f5150c7758cd3dfb)`(self)` + +#### `public def `[`count`](#classbitprim_1_1StealthList_1a12f2cede95c9e4b47ae9aeff6c7b2ff7)`(self)` + +#### `public def `[`nth`](#classbitprim_1_1StealthList_1a2565c5589877c4b44979148f1ac91eed)`(self,n)` + +#### `public def `[`__getitem__`](#classbitprim_1_1StealthList_1af8ab11d6980e5e5873f41e0acea9df49)`(self,key)` + +# class `bitprim::Transaction` + +Represents a Bitcoin Transaction. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1Transaction_1a46725d5acd8c3a8fb06522f401ea204c)`(self,ptr)` | +`public def `[`__del__`](#classbitprim_1_1Transaction_1a282bbff062532d2589e8ef4fcde173aa)`(self)` | +`public def `[`version`](#classbitprim_1_1Transaction_1aa78e3b53addcba62cd4417de17aad628)`(self)` | unsigned int: Transaction protocol version. +`public def `[`set_version`](#classbitprim_1_1Transaction_1ae17721a2689408ef4dd28f407eefeb88)`(self,`[`version`](#classbitprim_1_1Transaction_1aa78e3b53addcba62cd4417de17aad628)`)` | +`public def `[`hash`](#classbitprim_1_1Transaction_1aa679c88ddf7e352528c71bf3ae797ec9)`(self)` | bytearray: 32 bytes transaction hash. +`public def `[`hash_sighash_type`](#classbitprim_1_1Transaction_1ac4b2912c9d68a47cdc8bcdd15c520d89)`(self,sighash_type)` | bytearray: 32 bytes transaction hash. +`public def `[`locktime`](#classbitprim_1_1Transaction_1aab337d983f698afa256bf38287b26820)`(self)` | unsigned int: transaction locktime. +`public def `[`serialized_size`](#classbitprim_1_1Transaction_1af007310b3682d57b74ee70f944cb883e)`(self,wire)` | unsigned int: size of the transaction in bytes. +`public def `[`fees`](#classbitprim_1_1Transaction_1a9ee46a7fc71ab7c9a74322c628802186)`(self)` | unsigned int: fees to pay. Difference between input and output value. +`public def `[`signature_operations`](#classbitprim_1_1Transaction_1ade18c210a75584010597d76fde6b33f8)`(self)` | unsigned int: amount of signature operations in the transaction. +`public def `[`signature_operations_bip16_active`](#classbitprim_1_1Transaction_1a5897d20624e799b44b458a391fc8aa40)`(self,bip16_active)` | unsigned int: amount of signature operations in the transaction. +`public def `[`total_input_value`](#classbitprim_1_1Transaction_1ac8298d1f71febab13fe5f9b4f539e3ed)`(self)` | unsigned int: sum of every input value in the transaction. +`public def `[`total_output_value`](#classbitprim_1_1Transaction_1a3e3774f262498777003e86eed9d9381d)`(self)` | unsigned int: sum of every output value in the transaction. +`public def `[`is_coinbase`](#classbitprim_1_1Transaction_1ae7d6a8dd291a15968fa5f078a53af242)`(self)` | int: return '1' if transaction is coinbase. +`public def `[`is_null_non_coinbase`](#classbitprim_1_1Transaction_1a5539ce12185ded041ab9ce5b2a775485)`(self)` | int: return '1' if is not coinbase, but has null previous output. +`public def `[`is_oversized_coinbase`](#classbitprim_1_1Transaction_1a4c9a6cb88c82d9d8da7ef4db54dac402)`(self)` | int: returns '1' if coinbase has invalid script size on first input. +`public def `[`is_immature`](#classbitprim_1_1Transaction_1ad2cc8a92dc67e58db75ea3afe606342e)`(self,target_height)` | int: returns '1' if at least one of the inputs is not mature. +`public def `[`is_overspent`](#classbitprim_1_1Transaction_1afc10506073f96f853693d3f2049751ee)`(self)` | int: returns '1' if it is not a coinbase, and outputs value is higher than its inputs. +`public def `[`is_double_spend`](#classbitprim_1_1Transaction_1a4c9912869aa7f16772490a56718dabd2)`(self,include_unconfirmed)` | int: returns '1' if at least one of the previous outputs was already spent. +`public def `[`is_missing_previous_outputs`](#classbitprim_1_1Transaction_1ac4a82072535321b6563cbf0fb70c715a)`(self)` | int: returns '1' if at least one of the previous outputs is invalid. +`public def `[`is_final`](#classbitprim_1_1Transaction_1a814e76e41eac39d0d106a1bf26a879fc)`(self,block_height,block_time)` | int: returns '1' if transaction is final. +`public def `[`is_locktime_conflict`](#classbitprim_1_1Transaction_1ac269016ed1aea06944f1e5d273637ffb)`(self)` | int: returns '1' if its locked, but every input is final. +`public def `[`outputs`](#classbitprim_1_1Transaction_1a1d4f613af7fbd60d2421309fa967461f)`(self)` | OutputList: returns a list with every transaction output. +`public def `[`inputs`](#classbitprim_1_1Transaction_1acd7f943c9d0e9f3c76fddbb1d7c3db3b)`(self)` | InputList: returns a list with every transaction input. + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1Transaction_1a46725d5acd8c3a8fb06522f401ea204c)`(self,ptr)` + +#### `public def `[`__del__`](#classbitprim_1_1Transaction_1a282bbff062532d2589e8ef4fcde173aa)`(self)` + +#### `public def `[`version`](#classbitprim_1_1Transaction_1aa78e3b53addcba62cd4417de17aad628)`(self)` + +unsigned int: Transaction protocol version. + +#### `public def `[`set_version`](#classbitprim_1_1Transaction_1ae17721a2689408ef4dd28f407eefeb88)`(self,`[`version`](#classbitprim_1_1Transaction_1aa78e3b53addcba62cd4417de17aad628)`)` + +#### `public def `[`hash`](#classbitprim_1_1Transaction_1aa679c88ddf7e352528c71bf3ae797ec9)`(self)` + +bytearray: 32 bytes transaction hash. + +#### `public def `[`hash_sighash_type`](#classbitprim_1_1Transaction_1ac4b2912c9d68a47cdc8bcdd15c520d89)`(self,sighash_type)` + +bytearray: 32 bytes transaction hash. + +Args: + sighash_type (unsigned int): signature hash type. + +#### `public def `[`locktime`](#classbitprim_1_1Transaction_1aab337d983f698afa256bf38287b26820)`(self)` + +unsigned int: transaction locktime. + +#### `public def `[`serialized_size`](#classbitprim_1_1Transaction_1af007310b3682d57b74ee70f944cb883e)`(self,wire)` + +unsigned int: size of the transaction in bytes. + +Args: + wire (bool): if 'TRUE' size will include size of 'uint32' for storing spender height of output. + +#### `public def `[`fees`](#classbitprim_1_1Transaction_1a9ee46a7fc71ab7c9a74322c628802186)`(self)` + +unsigned int: fees to pay. Difference between input and output value. + +#### `public def `[`signature_operations`](#classbitprim_1_1Transaction_1ade18c210a75584010597d76fde6b33f8)`(self)` + +unsigned int: amount of signature operations in the transaction. +Returns max int in case of overflow. + +#### `public def `[`signature_operations_bip16_active`](#classbitprim_1_1Transaction_1a5897d20624e799b44b458a391fc8aa40)`(self,bip16_active)` + +unsigned int: amount of signature operations in the transaction. +Returns max int in case of overflow. + +Args: + + bip16_active (int): '1' if bip 16 is active. '0' if not. + +#### `public def `[`total_input_value`](#classbitprim_1_1Transaction_1ac8298d1f71febab13fe5f9b4f539e3ed)`(self)` + +unsigned int: sum of every input value in the transaction. +Returns max int in case of overflow. + +#### `public def `[`total_output_value`](#classbitprim_1_1Transaction_1a3e3774f262498777003e86eed9d9381d)`(self)` + +unsigned int: sum of every output value in the transaction. +return max int in case of overflow. + +#### `public def `[`is_coinbase`](#classbitprim_1_1Transaction_1ae7d6a8dd291a15968fa5f078a53af242)`(self)` + +int: return '1' if transaction is coinbase. + +#### `public def `[`is_null_non_coinbase`](#classbitprim_1_1Transaction_1a5539ce12185ded041ab9ce5b2a775485)`(self)` + +int: return '1' if is not coinbase, but has null previous output. + +#### `public def `[`is_oversized_coinbase`](#classbitprim_1_1Transaction_1a4c9a6cb88c82d9d8da7ef4db54dac402)`(self)` + +int: returns '1' if coinbase has invalid script size on first input. + +#### `public def `[`is_immature`](#classbitprim_1_1Transaction_1ad2cc8a92dc67e58db75ea3afe606342e)`(self,target_height)` + +int: returns '1' if at least one of the inputs is not mature. + +#### `public def `[`is_overspent`](#classbitprim_1_1Transaction_1afc10506073f96f853693d3f2049751ee)`(self)` + +int: returns '1' if it is not a coinbase, and outputs value is higher than its inputs. + +#### `public def `[`is_double_spend`](#classbitprim_1_1Transaction_1a4c9912869aa7f16772490a56718dabd2)`(self,include_unconfirmed)` + +int: returns '1' if at least one of the previous outputs was already spent. + +#### `public def `[`is_missing_previous_outputs`](#classbitprim_1_1Transaction_1ac4a82072535321b6563cbf0fb70c715a)`(self)` + +int: returns '1' if at least one of the previous outputs is invalid. + +#### `public def `[`is_final`](#classbitprim_1_1Transaction_1a814e76e41eac39d0d106a1bf26a879fc)`(self,block_height,block_time)` + +int: returns '1' if transaction is final. + +#### `public def `[`is_locktime_conflict`](#classbitprim_1_1Transaction_1ac269016ed1aea06944f1e5d273637ffb)`(self)` + +int: returns '1' if its locked, but every input is final. + +#### `public def `[`outputs`](#classbitprim_1_1Transaction_1a1d4f613af7fbd60d2421309fa967461f)`(self)` + +OutputList: returns a list with every transaction output. + +#### `public def `[`inputs`](#classbitprim_1_1Transaction_1acd7f943c9d0e9f3c76fddbb1d7c3db3b)`(self)` + +InputList: returns a list with every transaction input. + +# class `bitprim::TransactionList` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`__init__`](#classbitprim_1_1TransactionList_1a026cda25b13f6571665fac38e25dc76f)`(self,ptr)` | +`public def `[`__del__`](#classbitprim_1_1TransactionList_1a934e710f5cfb72c40312702fa9c0a188)`(self)` | +`public def `[`construct_default`](#classbitprim_1_1TransactionList_1a6d85dafaf12acf196c0a2fa04a380288)`(self)` | +`public def `[`push_back`](#classbitprim_1_1TransactionList_1a8923845ba6327427e13786ff136790d4)`(self,transaction)` | +`public def `[`list_count`](#classbitprim_1_1TransactionList_1a93e3ab285e7b747a3af2927e4a8ca9f5)`(self)` | +`public def `[`__getitem__`](#classbitprim_1_1TransactionList_1a997cffbbab6cfdcbb976e14ae7c3b09c)`(self,key)` | + +## Members + +#### `public def `[`__init__`](#classbitprim_1_1TransactionList_1a026cda25b13f6571665fac38e25dc76f)`(self,ptr)` + +#### `public def `[`__del__`](#classbitprim_1_1TransactionList_1a934e710f5cfb72c40312702fa9c0a188)`(self)` + +#### `public def `[`construct_default`](#classbitprim_1_1TransactionList_1a6d85dafaf12acf196c0a2fa04a380288)`(self)` + +#### `public def `[`push_back`](#classbitprim_1_1TransactionList_1a8923845ba6327427e13786ff136790d4)`(self,transaction)` + +#### `public def `[`list_count`](#classbitprim_1_1TransactionList_1a93e3ab285e7b747a3af2927e4a8ca9f5)`(self)` + +#### `public def `[`__getitem__`](#classbitprim_1_1TransactionList_1a997cffbbab6cfdcbb976e14ae7c3b09c)`(self,key)` + +# class `bitprim::Wallet` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public def `[`mnemonics_to_seed`](#classbitprim_1_1Wallet_1a4a8552caf0d1d1ff6bc8fdfc54b3a47f)`(cls,mnemonics)` | + +## Members + +#### `public def `[`mnemonics_to_seed`](#classbitprim_1_1Wallet_1a4a8552caf0d1d1ff6bc8fdfc54b3a47f)`(cls,mnemonics)` + +Generated by [Moxygen](https://sourcey.com/moxygen) \ No newline at end of file diff --git a/docs/developer_guide/python/Python-interface.md b/docs/developer_guide/python/Python-interface.md new file mode 100644 index 0000000..025deb3 --- /dev/null +++ b/docs/developer_guide/python/Python-interface.md @@ -0,0 +1,23 @@ +Bitprim's Pyhton interface is built on top of Bitprim's C interface, in this fashion: + +![binding](assets/binding.png) + +On top of the raw C interface, a 1-1 binding is made in Python, in order to separate access to the API from its usage; this avoids impedance mismatch by separating the marshalling aspects from the binding language idiosyncrasies. That is, the 1-1 interface takes care of marshalling, without changing the interface. Then, the idiomatic interface uses the higher level language tools and idioms in order to hide the complexity from the application programmer. + +It takes another programmer profile in order to tinker with the lower level interfaces or consume them directly, but that is also possible when working with this approach: 3 separate levels of abstraction for accessing the same functionality. + +## Basic structure + +--- + +See [the source in Github](https://github.com/bitprim/bitprim-py/tree/master): + +* **bitprimmodule.c**: This is where the 1-1 native interface is implemented. C functions which can be called from Python are defined here, implementing all necessary marshalling. +* **bitprim.py**: This is the idiomatic interface definition. Here, Python classes are defined and Python idioms and conventions offered to make life easier for the Python application programmer. +* **bitprim\_run.py**. Entry point. Creates an executor and starts it. Use for testing the API. + +## User guide + +--- + +Python interface documentation is available [here.](https://github.com/bitprim/bitprim-py/blob/master/doc/README.md) diff --git a/docs/developer_guide/python/assets/binding.png b/docs/developer_guide/python/assets/binding.png new file mode 100644 index 0000000000000000000000000000000000000000..fba59a1e719f13183880829e3ef891bbda893783 GIT binary patch literal 22164 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 U73hpcN+TRUs;QQ%YJT(o0``` + +2. Run the node using a configuration file: + +```./bn -c ``` + +## Advanced Installation + +Bitprim is a high performance node, so we have some options and pre-built packages tuned for several platforms. +Specifically, you can choose your computer _microarchitecture_ to download a pre-build executable compiled to take advantage of the instructions available in your processor. For example: + +``` +# For Haswell microarchitecture and Bitcoin Cash currency +conan install bitprim-node-exe/0.10.2@bitprim/stable -o currency=BCH -o microarchitecture=haswell +``` +So, you can manually choose the appropriate microarchitecture, some examples are: _x86_64_, _haswell_, _ivybridge_, _sandybridge_, _bulldozer_, ... +By default, if you do not specify any, the building system will select a base microarchitecture corresponding to your _Instruction Set Architecture_ (ISA). For example, for _Intel 80x86_, the x86_64 microarchitecture will be selected. + +### Automatic Microarchitecture selection + +Our build system has the ability to automatically detect the microarchitecture of your processor. To do this, first, you have to install our _pip_ package called [cpuid](https://pypi.python.org/pypi/cpuid). Our build system detects if this package is installed and in such case, makes use of it to detect the best possible executable for your processor. + +``` +pip install cpuid +conan install bitprim-node-exe/0.10.2@bitprim/stable +``` diff --git a/docs/user_guide/introduction.md b/docs/user_guide/introduction.md new file mode 100644 index 0000000..3222975 --- /dev/null +++ b/docs/user_guide/introduction.md @@ -0,0 +1,25 @@ +## Introduction + +*Bitprim* allows you to run a full +[Bitcoin Cash](https://www.bitcoincash.org/)/[Bitcoin](https://bitcoin.org/)/[Litecoin](https://litecoin.org/) node, with all four main features: + +* Wallet +* Mining +* Full blockchain +* Routing + +*Bitprim* also works as a cryptocurrency development platform with several programmable APIs: + +* C++ +* C +* C# +* Python +* Javascript +* Rust +* Golang + +... and networking APIs: + +* bitprim-insight: A Bitprim implementation of the Insight-API +* JSON-RPC +* Libbitcoin BS-BX protocol diff --git a/docs/user_guide/releases_notes.md b/docs/user_guide/releases_notes.md new file mode 100644 index 0000000..58a4d9f --- /dev/null +++ b/docs/user_guide/releases_notes.md @@ -0,0 +1,5 @@ +## Releases + + [Here](https://github.com/bitprim/bitprim/blob/master/doc/release-notes/release-notes.md) is the list of bitprim's releases + + diff --git a/docs/user_guide/rpc.md b/docs/user_guide/rpc.md new file mode 100644 index 0000000..86c697c --- /dev/null +++ b/docs/user_guide/rpc.md @@ -0,0 +1,29 @@ +We are currently developing full RPC support, to be compatible with software that currently relies on other Bitcoin implementations. + +Currently we are able to respond to the following messages: + +* `getaddressbalance` +* `getaddresstxids` +* `getaddressdeltas` +* `getaddressutxos` +* `getblockhashes` +* `getaddressmempool` +* `getbestblockhash` +* `getblock` +* `getblockhash` +* `getblockchaininfo` +* `getblockheader` +* `getblockcount` +* `getblocktemplate` +* `getchaintips` +* `getdifficulty` +* `getinfo` +* `getmininginfo` +* `getrawtransaction` +* `getspentinfo` +* `validateaddress` +* `sendrawtransaction` +* `submitblock` + +This allow us to successfully mine using our software. + diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..5074e77 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,41 @@ +site_name: Bitprim +site_url: http://www.bitprim.org +site_description: Bitprim +site_author: Bitprim Team + +repo_url: https://github.com/mkdocs/mkdocs/ +edit_uri: "" + +pages: + - Home: index.md + - User Guide: + - Introduction: user_guide/introduction.md + - Installation: user_guide/installation.md + - RPC: user_guide/rpc.md + - Release Notes: user_guide/releases_notes.md + - Developer Guide: + - Introduction: developer_guide/introduction.md + - .Net: + - Introduction: developer_guide/dotnet/dotnet-Interface.md + - Reference: developer_guide/dotnet/dotnet-interface-details.md + - C: + - Introduction: developer_guide/c/C-interface.md + - Reference: developer_guide/c/api.md + - C++: + - Introduction: developer_guide/c++/C---interface.md + - Python: + - Introduction: developer_guide/python/Python-interface.md + - Reference: developer_guide/python/Python-interface-details.md + - Go: + - Introduction: developer_guide/go/Go-interface.md + - About: + - Team: team.md + +copyright: Copyright © 2018 Bitprim + +markdown_extensions: + - toc: + permalink: # + +plugins: + - search \ No newline at end of file