Skip to content

.NET Bindings - BitcoinKernel.NET

BitcoinKernel.NET provides C# bindings for libbitcoinkernel with managed wrappers over native handles.


Requirements

Requirement Value
.NET SDK 9.0+
Native library libbitcoinkernel (bundled for macOS x64/arm64 in current project state)
Main package BitcoinKernel
Enums package BitcoinKernel.Interop.Enums

Namespace Structure

Namespace Description
BitcoinKernel Root objects like KernelContext, KernelContextOptions, LoggingConnection.
BitcoinKernel.Chain Chain, ChainParameters, ChainstateManager, ChainstateManagerOptions.
BitcoinKernel.Primatives Block/transaction primitives (Block, Transaction, TxOut, Coin, etc.).
BitcoinKernel.ScriptVerification ScriptVerifier and PrecomputedTransactionData.
BitcoinKernel.BlockProcessing BlockProcessor, BlockTreeEntry, validation result wrappers.
BitcoinKernel.Exceptions Domain-specific exception hierarchy.
BitcoinKernel.Interop.Enums Network, logging, script, and validation enums.

Memory Management

Most wrapper types own native resources and implement IDisposable. Use using / using var consistently.

using BitcoinKernel;
using BitcoinKernel.Chain;
using BitcoinKernel.Interop.Enums;

using var chainParams = new ChainParameters(ChainType.MAINNET);
using var contextOptions = new KernelContextOptions().SetChainParams(chainParams);
using var context = new KernelContext(contextOptions);
using var managerOptions = new ChainstateManagerOptions(
    context,
    dataDirectory: "/path/to/datadir",
    blocksDirectory: "/path/to/blocks");
using var chainstate = new ChainstateManager(context, chainParams, managerOptions);

Objects returned as non-owning views (for example from GetOutputAt() and several chain/block accessors) must not outlive their parent objects.


Quick Start

using BitcoinKernel;
using BitcoinKernel.Chain;
using BitcoinKernel.Interop.Enums;

using var logging = new LoggingConnection((category, message, level) =>
    Console.WriteLine($"[{category}] {message}"));

using var chainParams = new ChainParameters(ChainType.MAINNET);
using var contextOptions = new KernelContextOptions().SetChainParams(chainParams);
using var context = new KernelContext(contextOptions);
using var options = new ChainstateManagerOptions(context, "/tmp/bitcoin", "/tmp/bitcoin/blocks");
using var chainstate = new ChainstateManager(context, chainParams, options);

chainstate.ImportBlocks();

var chain = chainstate.GetActiveChain();
Console.WriteLine($"Height: {chain.Height}");
Console.WriteLine($"Genesis: {Convert.ToHexString(chain.GetGenesis().GetBlockHash())}");